Por favor, considere este código. Já vi esse tipo de código várias vezes. words
é um vetor local. Como é possível retorná-lo de uma função?
Podemos garantir que não morrerá?
std::vector<std::string> read_file(const std::string& path)
{
std::ifstream file("E:\\names.txt");
if (!file.is_open())
{
std::cerr << "Unable to open file" << "\n";
std::exit(-1);
}
std::vector<string> words;//this vector will be returned
std::string token;
while (std::getline(file, token, ','))
{
words.push_back(token);
}
return words;
}
std::vector<std::string>&
Respostas:
Desde que nenhuma referência seja retornada, é perfeitamente normal fazê-lo.
words
será movido para a variável que recebe o resultado.A variável local sairá do escopo. depois de movido (ou copiado).
fonte
Pré C ++ 11:
A função não retornará a variável local, mas sim uma cópia dela. Seu compilador pode, entretanto, realizar uma otimização onde nenhuma ação de cópia real é feita.
Veja esta pergunta e resposta para mais detalhes.
C ++ 11:
A função irá mover o valor. Veja esta resposta para mais detalhes.
fonte
Eu acho que você está se referindo ao problema em C (e C ++) que retornar um array de uma função não é permitido (ou pelo menos não funcionará como esperado) - isso ocorre porque o retorno do array irá (se você escrever em a forma simples) retorna um ponteiro para a matriz real na pilha, que então é imediatamente removida quando a função retorna.
Mas, neste caso, funciona, porque
std::vector
é uma classe, e classes, como structs, podem (e serão) copiadas para o contexto do chamador. [Na verdade, a maioria dos compiladores otimizará esse tipo específico de cópia usando algo chamado "Otimização do valor de retorno", especificamente introduzida para evitar a cópia de objetos grandes quando eles são retornados de uma função, mas isso é uma otimização e, da perspectiva dos programadores, se comporte como se o construtor de atribuição fosse chamado para o objeto]Contanto que você não retorne um ponteiro ou uma referência a algo que está dentro do retorno da função, tudo bem.
fonte
Para entender bem o comportamento, você pode executar este código:
O resultado é o seguinte:
Observe que este exemplo foi fornecido no contexto C ++ 03, ele poderia ser melhorado para C ++> = 11
fonte
Não concordo e não recomendo devolver
vector
:Isso é muito mais rápido:
Testei no Visual Studio 2017 com os seguintes resultados no modo de lançamento:
8,01 MOPs por referência
5,09 MOPs retornando vetor
No modo de depuração, as coisas são muito piores:
0,053 MOPS por referência
0,034 MOPs por vetor de retorno
fonte
Na verdade, isso é uma falha de design. Você não deve usar um valor de retorno para nada que não seja um primitivo para nada que não seja relativamente trivial.
A solução ideal deve ser implementada através de um parâmetro de retorno com decisão sobre referência / ponteiro e o uso adequado de um "const \ 'y \' ness" como descritor.
Além disso, você deve perceber que o rótulo em uma matriz em C e C ++ é efetivamente um ponteiro e sua assinatura é efetivamente um deslocamento ou um símbolo de adição.
Portanto, o rótulo ou ptr array_ptr === rótulo do array, portanto, retornando foo [deslocamento] está realmente dizendo o elemento de retorno na localização do ponteiro de memória foo + deslocamento do tipo tipo de retorno.
fonte