2016-04-18 10 views
0
class MyClass 
{ 
    public:  
    int a; 
    MyClass(int r): a(r) {} 

    MyClass(const MyClass& ref) 
    { 
     cout << "Copy Constructor\n"; 
     a= ref.a; 
    } 
}; 
int main() 
{ 
    MyClass obj(5); 
    MyClass obj1(MyClass(5)); //Case 1 
    MyClass obj2(obj);  //Case 2 
    return 0; 
} 

Warum der Kopierkonstruktor aufgerufen wird, in Fall 2, nicht in Fall 1. Im Fall 1 ein temporäres Objekt als Argument übergeben wird.Warum Konstruktor kopieren nicht, wenn Pass temporäre Objekt namens

+1

'-fno-elide-constructors' –

+0

-fno-elide-Konstrukteuren verwendet, während auch den Anruf tätigen Kompilieren DINT kopieren Konstruktor – Akshat

+0

nach dem Bearbeiten wieder eröffnet –

Antwort

2

In MyClass obj1(MyClass(5)); eliiert der Compiler das temporäre Objekt MyClass(5), weil es erlaubt ist.

insbesondere C++ Standard 2014 §12.8 para 31 definiert Fälle, wenn Kopie elision kann durchgeführt werden:

wenn bestimmte Kriterien erfüllt sind, ist eine Implementierung erlaubt das Kopieren/Verschieben Bau von wegzulassen ein Klassenobjekt, selbst wenn der Konstruktor, der für die Kopier-/Verschiebungsoperation und/oder den Destruktor für das Objekt ausgewählt wurde, Nebenwirkungen hat. Diese Eliminierung von Kopier-/Verschiebungsvorgängen, die Kopierfreigabe genannt wird, ist unter den folgenden Umständen zulässig (die kann kombiniert werden, um mehrere Kopien zu eliminieren):

  • Wenn ein temporäres Klassenobjekt, das nicht an einen Verweis (12.2) gebunden wurde, in ein Klassenobjekt mit demselben cv-unqualifizierten Typ kopiert/verschoben wird, kann der Kopier-/Verschiebevorgang durch direktes Konstruieren des temporären Objekts ausgelassen werden in das Ziel der ausgelassenen Kopie/Bewegung.
Verwandte Themen