2009-08-28 5 views
9

Je le code suivantliaison temporaire à une référence lvalue

string three() 
{ 
    return "three"; 
} 

void mutate(string& ref) 
{ 
} 

int main() 
{ 
    mutate(three()); 
    return 0; 
} 

Vous pouvez voir que je passe trois()-muter méthode. Ce code se compile bien. Ma compréhension est, les temporaires ne peuvent pas être assignés à des références non-const. Si oui, comment ce programme compile-t-il?

Des pensées?

Edit:

Compilateurs essayé: VS 2008 et VS2010 Beta

+0

Essayez GCC, il est plus proche de la norme C++. – Learner

+0

Malheureusement, je n'ai pas GCC avec moi. –

+0

@Appu: Après avoir corrigé le code des préfixes manquants et des préfixes 'std', Comeau (http://www.comeaucomputing.com/tryitout/) dit:' la valeur initiale de la référence à non-const doit être une lvalue'. La raison pour laquelle VC accepte cela est que VC est cassé. (Ils l'appellent une "fonctionnalité", mais en fait c'est un bug.) – sbi

Répondre

8

Il compilait dans le compilateur VC6, donc je suppose que pour maintenir la compatibilité ascendante, VS2008 supporte cette extension non-standard. Essayez avec le drapeau /Za (désactiver l'extension de la langue), vous devriez alors recevoir une erreur.

+0

Great! Ça fonctionne maintenant. –

+0

La spécification de l'option '/ Za' peut entraîner des problèmes avec l'inclusion de' windows.h' ou d'autres en-têtes spécifiques. –

+5

Utiliser le niveau d'avertissement comme quatre est meilleure option que j'ai utilisé – yesraaj

1

Il ne décompiler, avec g ++ 4 au moins:

foo.cpp: In function ‘int main()’: 
foo.cpp:16: error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’ 
foo.cpp:10: error: in passing argument 1 of ‘void mutate(std::string&)’ 

(Les numéros de ligne sont off par 3 ou 4, parce que je devais ajouter les lignes #include et 'using'.)

Ainsi, votre compilateur ne semble pas être aussi strict qu'il devrait l'être.

+0

Edited post et ajouté des compilateurs que j'utilise. –

0

Je suppose que cela dépend du compilateur. g ++ 4.1.2 me le donne. Peut-être parce que vous ne faites rien l'appel est optimisé loin.

+0

J'ai essayé de faire quelque chose avec le paramètre ref dans la méthode mute() et il compile encore –

+0

Je l'ai essayé dans VC++ tout à l'heure et il compile et fonctionne à moins de désactiver les extensions dans les propriétés du projet. Quand vous obtenez ceci: 1> main.cpp 1> d: \ all \ projets \ ordinateur portable \ 2 \ asd \ main.cpp (16): erreur C2664: 'mutate': impossible de convertir le paramètre 1 de 'std :: string' à 'std :: string &' 1> Une référence non-const ne peut être liée qu'à un lvalue –

3

Ceci est une extension Microsoft, pour imiter le comportement de nombreux autres compilateurs Microsoft. Si vous activez les avertissements W4, vous verrez l'avertissement.

4

C'est l'extension perverse de VC++. Si vous compilez avec/W4, le compilateur vous avertira. Je suppose que vous lisez le Rvalue References: C++0x Features in VC10, Part 2. Cet article a également mentionné ce problème.

+0

Oui. Je suis en train de lire cet article. –

Questions connexes