2009-04-17 14 views
9

Nach dem Lesen this article auf Herb Sutters Blog, experimentierte ich ein wenig und stieß auf etwas, das mich verwirrt. Ich verwende Visual C++ 2005, aber ich wäre überrascht, wenn dies von der Implementierung abhängig wäre.Const Referenz auf temporäre

Hier ist mein Code:

#include <iostream> 

using namespace std; 

struct Base { 
    //Base() {} 
    ~Base() { cout << "~Base()" << endl; } 
}; 

int main() 
{ 
    const Base & f = Base(); 
} 

Sobald er ausgeführt wird, zeigt es "~Base()" zweimal ... Aber wenn ich un-Kommentar den Konstruktor, zeigt er es nur einmal !

Hat jemand eine Erklärung dafür?

Antwort

24

Diese IS-Implementierung ist abhängig.

Der Standard ermöglicht eine Kopie beim Binden einer temporären an eine const-Referenz. In Ihrem Fall führt VC++ nur dann eine Kopie durch, wenn der Konstruktor implizit definiert ist. Dies ist unerwartet, aber erlaubt.

C++ 1x will fix this.

+0

Erstaunliche Antwort, vielen Dank Sir :) – Drealmer

+0

Interessant. Wird dies in einigen Fällen zum Objekt-Slicing führen? –

+0

"C++ 1x wird das beheben." Oh Schatz, ist das, was sie den nächsten Standard nennen, oder ist das ein witziger Witz? – veefu

Verwandte Themen