7 Stimmen

Kopierkonstruktor mit Standardparametern wird nie aufgerufen

Warum ist die Ausgabe des folgenden Programms nur int3 und nicht int3&4 ?

#include <iostream>

class B
{
public:
    explicit B(int i) { std::cout<<"int"<<i; }
    B(const B& rhs, int i = 0) { std::cout<<"&"<<i; }
};

int main(int, char**)
{
    B b(B(3), 4);
}

Befehl: clang++ test.cpp -O0

Compiler: Apple clang Version 3.0 (tags/Apple/clang-211.12) (basierend auf LLVM 3.0svn)

3voto

Carl Punkte 41134

Sieht aus, als hätten Sie einen Compilerfehler gefunden :)

Wenn Sie Ihre Compiler-Version auf eine andere als LLVM 3.0 ändern, lautet die Ausgabe int3&4.

Auf LLVm 3.0 wird int3&4 gedruckt, es scheint also damit zusammenzuhängen, dass B(3) ein temporäres Objekt ist:

class B
{
public:
    explicit B(int i)
    { 
        std::cout<<"int"<<i; 
    }
    B(const B& rhs, int i = 0) 
    { 
        std::cout<<"&"<<i; 
    }
};

int main(int, char**)
{
    B a(3);
    B b(a, 4);
}

2voto

Richard Smith Punkte 13137

Dies war ein Fehler in Clang die über wurde inzwischen behoben . Copy-Elision wurde fälschlicherweise auf den Konstruktoraufruf angewendet, da Clang nicht prüfte, wie viele Argumente bereitgestellt wurden, bevor es zu dem Schluss kam, dass es sich um eine Kopierkonstruktion handelte.

Der Fix wird in der kommenden clang 3.1 Version enthalten sein.

0voto

Puppy Punkte 141483

Höchstwahrscheinlich haben RVO und NRVO Ihren Code gefressen. Diese besonderen Bedingungen ermöglichen es dem Compiler, Objektkopien, die sonst von der Sprache erzwungen würden, stillschweigend zu eliminieren. Da infolgedessen niemals eine Kopie erstellt wurde, gibt der Code die Anweisung im Kopierkonstruktor nicht aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X