Por que o C++ permite que constantes sejam transformadas em argumentos de referência em outro método?

StackOverflow https://stackoverflow.com/questions/1957667

Pergunta

void outputString(const string &ss) {
    cout << "outputString(const string& ) " + ss << endl;
}

int main(void) {
    outputString("constant tranformed to reference argument");
    //! outputString(new string("abc")); new only return pointer to object
    return 0;
}

Como é proibido criar referências temporárias de objetos transformando-as em métodos, essa sintaxe deveria ser inútil, mas até tornar as coisas mais confusas. Então, por que o C++ se preocupa em suportar esse tipo de sintaxe?

EDITAR:Para ser sincero, não entendi sua representação. Considerando o exemplo acima, normalmente usaríamos void outputString(const string ss) em vez de void outputString(const string &ss).Acho que o normal é que os métodos de 'passagem por valor' lidem com constantes/variáveis ​​e os métodos de 'passagem por referência' lidem apenas com variáveis. const type-id & em vez de const type-id para constantes é eficiência porque os métodos de 'passagem por referência' pegam apenas os ponteiros (endereços) das constantes/variáveis ​​de objetos primitivos, mas os métodos de 'passagem por valor' precisam fazer a cópia.

obrigado.

Foi útil?

Solução

Quais são suas alternativas?

void outputString(const string ss);

Isso criará uma cópia de qualquer string passada, mesmo que o tipo corresponda exatamente:Despesas gerais que não são realmente necessárias!

void outputString(string &ss);

Isso permitirá alterar o argumento passado.Não queremos fazer isso, e o C++ não nos permite mais passar um temporário, para nos proteger de alterar um temporário (onde essas alterações serão perdidas nos próximos momentos de qualquer maneira).

Então, do jeito que você tem, cabe em dois lados:Ele nos permite passar strings não temporárias sem copiá-las e também permite passar strings temporárias. E protege-nos de tentar mudar o argumento.Parece um bom compromisso.

Outras dicas

Só é permitido criar uma referência temporária para parâmetros const.Se o parâmetro não fosse uma referência const então você poderia alterar os dados no método sem perceber que sua referência era a uma cópia temporária dos dados e por isso é proibido.

Porém, quando é uma referência const, você não pode alterar os dados, portanto, não importa que seja uma referência a uma cópia e tão segura e, portanto, permitida, pois é útil, como mostra seu exemplo.

Onde você está modificando ss?

cout << "outputString(const string& ) " + ss << endl;

Esta linha cria um ambiente temporário sob o capô sem modificando o const& objeto ss.

O compilador normalmente fará:

string tmp = "outputString(const string& ) " + ss;
cout << tmp << endl;

Quer dizer, isso permite literais a ser transformado em uma referência de objeto const.

Isso é importante.Caso contrário, você teria que escrever OutputString(std::string("literal")) e seria muito chato.Alguém poderia fazer sobrecargas separadas para um método que aceita std::string e char*.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top