2016-03-20 1 views
3

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?

+0

g ++ 4.8.2 donne une "erreur: initialisation invalide de la référence non-const de type ..." pour * chaque * de ces lignes. –

+0

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. –

+1

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

Répondre

3

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.

+0

"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

+0

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

2

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.

+0

Merci pour votre réponse. Je pense que c'est parce que j'utilise MSVC. – Eugene