2017-10-10 7 views
3

Je pratique les choses décrites Here pour apprendre le concept de lvalue et de rvalue.Prendre l'adresse d'une valeur autorisée?

Cependant, quand je construis mon propre exemple comme suit, je trouve qu'il compile et fonctionne sans aucune erreur (en utilisant VS2017). J'ai appris que dans le cas 1, il est le même que d'appeler

produceA(10).operator=(A()) 

et est donc légal. Mais, je ne comprends toujours pas pourquoi les cas 2 et 3 sont autorisés. En fait, le cas 2 contredit même l'exemple donné dans l'article. Suis-je en train d'obtenir les adresses de valeurs dans ces 2 cas? Conduisent-ils à un comportement indéfini?

#include <string> 

class A 
{ 
    int data = 1; 
public: 
    A() = default; 

    A(int in) 
    : data(in) 
    {} 

    A& operator=(const A& rhs) 
    { 
     data = rhs.data; 
     return *this; 
    } 
}; 

A produceA(int i) 
{ 
    A a(i); 
    return a; 
} 


int main() 
{ 
    // case 1 
    produceA(10) = A(); 

    // case 2 
    A* pa = &produceA(10); // rvalue? 

    // case 3 
    std::string* pstr = &std::string("Temp"); // rvalue? 

    return 0; 
} 
+0

Votre exemple de code [ne compile pas] (http://coliru.stacked-crooked.com/a/a5adcbe34052d925). Quel compilateur utilisez-vous? – Quentin

+0

J'ai essayé ceci à la fois VS2013 et VS2017. Les deux ne donnent aucune erreur. –

+0

Merci beaucoup. Je trouve aussi [celui-ci] (https://stackoverflow.com/questions/16380966/non-const-reference-bound-to-temporary-visual-studio-bug) après ton indice. L'utilisation de l'option de commande/Za rend les erreurs de cas 2 et 3. Le but derrière cette extension me semble si mystérieux. :/ –

Répondre

0

&produceA(10) est l'adresse du type temporaire de type A anonyme retourné de la fonction. Vous êtes autorisé à lui attribuer un pointeur, mais ce pointeur n'est valide que pour la durée de vie de l'instruction entière.

La même chose peut être dite pour &std::string("Temp"); encore une fois, ceci est une adresse d'un anonyme temporaire.

+0

Mais ... Vous ne pouvez pas prendre l'adresse d'un temporaire:/'erreur: prendre l'adresse d'un objet temporaire de type 'A' [-Waddress-of-temporaire]' – Quentin