35 votes

Pourquoi le constructeur de référence r-valeur est-il appelé dans ce cas?

 #include<iostream>
using namespace std;

struct B{};

struct A
{
    A(const B &)
    {
        cout<<"A(const B &)"<<endl;
    }
    A(B &&)
    {
        cout<<"A(B &&)"<<endl;
    }
};

A get()
{
    B b;
    return b;
}

int main()
{
    get();
}
 

J'ai testé le code avec VC ++ 14.2 et GCC 5.4.0, les deux sorties:

 A(B &&)
 

Pourquoi la sortie n'est-elle pas

 A(const B &)
 

?

Ce code a-t-il une relation avec copy elision ? (Mais A et B sont des types différents, donc copy elision ne devrait pas fonctionner ici)

29voto

Kerrek SB Points 194696

Le retour-comme-rvalue règles modifiées en réponse à l'examen avant la publication de C++14. La modification a été ajoutée tardivement dans le processus et est capturé par GTC Question 1579, qui modifie 12.8/32, avec la mention:

ou quand l'expression en return déclaration est une (peut-être entre parenthèses) id-expression désignant un objet avec stockage automatique de la durée déclarée dans le corps

Cela signifie que tout retour de variable locale considère désormais l'objet désigné par la variable comme si elle était une rvalue première (d'essayer de nouveau si une surcharge d'échec de résolution).

Depuis la GTC question a été accepté comme un défaut dans la langue, les compilateurs peuvent mettre en œuvre cette nouvelle règle, même en "C++11 mode". Le point de défaut, c'est que "c'était toujours dans le but de travailler de cette façon", donc ce n'est pas à proprement parler d'un changement entre le C++11 et C++14, mais plutôt, le sens de C++11 a été modifié en 2014.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X