Tenho problemas para entender quando um tipo deduz ao std::ranges::dangling
usar variáveis locais nomeadas versus um pré-valor como argumentos para std::ranges::sort
algoritmo. Por exemplo, tenho uma função que retorna a prvalue
para um contêiner padrão, digamos std::vector que uso diretamente como argumento para std::ranges::sort
, então espero obter um erro de compilação std::ranges::dangling
quando tento desreferenciar o iterador, que é o que recebo:
#include <vector>
#include <algorithm>
auto get_data(){
return std::vector<int>{1, 2, 99, 5, 9, 4};
}
auto get_sorted(){
return std::ranges::sort(get_data());
}
int main(){
auto it = get_sorted();
*(it-1); //Compiler Error because it is a std::ranges::dangling iterator
}
No entanto, se eu alterar get_sorted
ligeiramente a função acima para primeiro capturar o vetor em uma variável nomeada e usá-lo para retornar o resultado de std::ranges::sort
, então não recebo um iterador pendente, mesmo main
que o vetor alocado na variável nomeada deva ter sido destruído após a função get_sorted
retornar:
auto get_sorted(){
auto vec = get_data();
return std::ranges::sort(vec);
}
int main(){
auto it = get_sorted();
*(it-1); //Okay result = 99
}
Mesmo se eu mudar get_sorted
para usar um contêiner baseado em variável nomeada declarado localmente, recebo um comportamento em que o compilador não reclama sobre o iterador pendente ao ser desreferenciado em seu chamador (digamos, main
function).
//doesn't return a std::ranges::dangling
auto get_sorted(){
std::vector<int> vec{1, 2, 99, 5, 9, 4};
return std::ranges::sort(vec);
}
e quando passo um vetor pré-valor para o std::ranges::sort
algoritmo, recebo novamente o std::ranges::dangling
esperado
//returns a std::ranges::dangling
auto get_sorted(){
std::vector<int> vec{1, 2, 99, 5, 9, 4};
return std::ranges::sort(std::vector<int>{1, 2, 99, 5, 9, 4});
}
Para os casos em que não recebo um erro do compilador, std::ragnes::dangling
observo um erro de tempo de execução ao compilar com fSanitize=address
a opção, o que provavelmente ocorre porque os vetores que foram alocados na variável nomeada dentro da get_sorted
função saíram do escopo assim que a última função devolvida.
No entanto, gostaria de entender por que o uso de variável nomeada dentro de uma função altera o tipo de retorno da get_sorted
função e possível um guia sobre como usar contêineres temporários e pré-valores corretamente para obter std::ranges::dangling
sempre que possível.