Pourquoi la première ligne ne compile pas pendant la compilation de la deuxième ligne? Cela signifie-t-il que le constructeur de chaîne renvoie une valeur lvalue?C++ - Le constructeur de type classe renvoie une lvalue?
Répondre
Le constructeur par définition n'a pas de valeur de retour. Ce que vous essayez d'effectuer est de faire référence à une valeur temporaire qui n'est pas autorisée.
Bon article à comprendre à la fois lvalue
et rvalue
références est C++ Rvalue References Explained.
"Ce que vous essayez d'effectuer est de faire une référence à une valeur temporaire qui n'est pas autorisée." Oui, je suis d'accord avec cette déclaration. J'étais juste confus pourquoi la deuxième ligne se compile. cpplearner a raison. J'utilise MSVC. Peut-être que MSVC a des propriétés spéciales? – Eugene
C'est étrange, car j'obtiens la même erreur dans les deux cas avec gcc et clang: 'ne peut pas initialiser une référence non-const à partir d'un rvalue'. – karastojko
Ce que vous obtenez est pas ce que vous attendez:
float& ref = float(10);
Ce qui se passe ici? float(10)
crée un flottant temporaire (non lié à quoi que ce soit), il s'agit donc d'un rvalue. Par conséquent, vous ne pouvez pas le lier à une référence de lvalue non-const. Les mécanismes impliqués sont les mêmes pour std::string
. Je suis perplexe que vous n'obtenez pas une erreur de compilation sur l'exemple de chaîne (je fais avec gcc 5.3.0)
Notez que cela n'a rien à voir avec une soi-disant "valeur de retour constructeur", car les constructeurs n'ont pas telle chose.
Merci pour votre réponse. Je pense que c'est parce que j'utilise MSVC. – Eugene
g ++ 4.8.2 donne une "erreur: initialisation invalide de la référence non-const de type ..." pour * chaque * de ces lignes. –
C'est une bonne question, ce qui me pousse à me demander comment se fait-il qu'il y ait toujours des questions de vote à la baisse/de clôture de vote ici (et même sans laisser de commentaire expliquant pourquoi). Certains utilisateurs ici devraient être légitimement privés de ce privilège. –
Je suppose que la deuxième ligne compile parce que vous utilisez MSVC et que vous n'avez pas compilé avec/W4. Si vous aviez compilé avec/W4, vous auriez dû voir quelque chose comme "avertissement C4239: extension non standard utilisée". – cpplearner