une référence de type “std::string&” (pas const-qualifiés) ne peut pas être initialisé
Lorsque j'essaie de compiler la fonction suivante, je reçois l'erreur.
string& foo(){
return "Hello World";
}
Error:
1 IntelliSense: a reference of type "std::string &" (not const-qualified) cannot be initialized with a value of type "const char [12]"
Bienvenue à Débordement de Pile. C'est un question-réponse le site, dans lequel vous poser des questions et tout le monde apporte des réponses. Mais votre message n'a pas de question! Merci d'éditer ton post pour y inclure une question.
Et pourquoi voudriez-vous faire cela?
Je veux ressembler à une condescendance idiot! Évidemment, on savait qu'il était à la recherche de l'aide.
Et pourquoi voudriez-vous faire cela?
Je veux ressembler à une condescendance idiot! Évidemment, on savait qu'il était à la recherche de l'aide.
OriginalL'auteur wayfare | 2011-05-25
Vous devez vous connecter pour publier un commentaire.
Il y a deux problèmes avec votre code. Tout d'abord,
"Hello World!"
est unchar const[13]
, pas unstd::string
. Ainsi, le compilateur doit(implicitement) le convertir en un
std::string
. Le résultat d'unela conversion n'est que temporaire (rvalue en C++-parler), et vous ne pouvez pas
initialiser une référence à un non-const avec un temporaire de. La deuxième est
que même si vous pouvez (ou que vous avez déclarée à la fonction de renvoyer un
référence const), vous êtes de retour d'une référence à quelque chose qui
immédiatement aller hors de portée (et donc être détruits); toute utilisation de
la référence qui en découlent entraînera un comportement indéfini.
La vraie question est: pourquoi la référence? Sauf si vous êtes réellement
se référant à quelque chose dans un objet disposant d'une plus longue durée de vie, avec la
l'intention que le code de client le modifier (généralement pas une bonne idée, mais
il y a des exceptions notables, comme
operator[]
d'un vecteur), vous devezretour par valeur.
OriginalL'auteur James Kanze
"Hello World" n'est pas une chaîne, c'est un tableau de char. Le compilateur c++ doit de le convertir en une chaîne de valeur, pas une chaîne de référence (car ce n'est pas une chaîne de caractères), de sorte que votre fonction doit ressembler à:
À se développer (à la demande du commettant) le compilateur fait quelque chose comme ceci:
La valeur de s est copié de la fonction par le std::string constructeur de copie.
OriginalL'auteur Neil Butterworth
Vous demandez le compilateur pour le retour temporaire std::string créé à partir du char array "Hello World". Il doit mettre quelque part et que quelqu'un responsable pour le nettoyage. Vous pouvez le faire de plusieurs façons:
La deuxième serait probablement la méthode la plus simple. Le compilateur utilisera RVO (valeur de retour d'optimisation) pour supprimer la copie invoquée par qui.
OriginalL'auteur dascandy
Viens de le faire.
OriginalL'auteur TheBuzzSaw
Je pense que vous voulez:
J'ai édité ma réponse.
Je ne vois pas pourquoi cela devrait être supprimé.
OriginalL'auteur user757421