9
votes

Contraignant temporaire à une référence de lvalue

J'ai le code suivant

string three()
{
    return "three";
}

void mutate(string& ref)
{
}

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


3 commentaires

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


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


@Appu: Après avoir corrigé votre code pour un inclus manquant et std Préfixes, Comeau ( COMEAUCOMPUTATION .com / Tryitout ) dit: La valeur initiale de la référence à la non-const doit être une lvalue . La raison pour laquelle VC accepte cela est que VC est cassé. (Ils l'appellent une "fonctionnalité", mais c'est en fait un bug.)


5 Réponses :


1
votes

It ne compile pas , avec g ++ 4 au moins: xxx

(les numéros de ligne sont éteints par 3 ou 4, car je devais ajouter le #include et 'utiliser' lignes.)

Donc, votre compilateur semble ne pas être aussi strict que cela devrait être.


1 commentaires

Publier édité et compilateurs ajoutés que j'utilise.



0
votes

Je suppose que cela dépend du compilateur. G ++ 4.1.2 me donne ceci. XXX

Peut-être parce que vous ne faites rien, l'appel est optimisé.


2 commentaires

J'ai essayé de faire quelque chose avec le paramètre refer à l'intérieur de la méthode mutée () et il compile toujours


Je l'ai essayé en VC ++, juste maintenant et cela compile et travaille à moins que vous ne désactivez les extensions dans les propriétés du projet. Lorsque vous obtenez-vous, vous obtenez ceci: 1> Main.cpp 1> D: \ Tous \ Projects \ Laptop \ 2 \ asd \ asd \ MAIN.CPP (16): Erreur C2664: 'Mutate': impossible de convertir le paramètre 1 de 'std :: string 'to' std :: string & '1> une référence non-consons ne peut être liée qu'à un lvalue



8
votes

Il utilisait pour compiler dans le compilateur VC6, donc je suppose que la comptibilité rétro-retour VS2008 prend en charge cette extension non standard. Essayez avec / za (Désactiver l'extension de langue) Drapeau , vous devriez obtenir une erreur alors.


2 commentaires

L'option Spécification / za pourrait entraîner des problèmes avec lesquels windows.h ou d'autres en-têtes spécifiques Windows.


En utilisant le niveau d'avertissement comme quatre est une meilleure option qui est ce que j'ai utilisé



3
votes

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


0 commentaires

4
votes

Il s'agit d'une extension diabolique VC ++. Si vous êtes oomple avec / w4, alors le compilateur vous avertira. Je suppose que vous lisez le Revalue Références: C ++ 0x Caractéristiques en VC10, Partie 2 . Cet article avait également mentionné ce problème.


0 commentaires