Warum benötigt der Verweis auf den Aufruf des Objektgenerators den Kopierkonstruktor?

8

Ich bekomme Probleme mit dem folgenden Code mit Visual Studio 2010 C ++.

makeA () ist nur ein Objektgenerator-Idiom in C ++ (wie std :: make_pair)

%Vor%

Fehlermeldung

%Vor%

Ich erwarte, dass makeA () sowohl A () - Konstruktor als auch A (A & amp; & amp;;) -Konstruktor aufruft, und 22. Zeile ruft makeA () und sonst nichts auf. (Wenn ohne RVO) Der Compiler sollte keinen A (const A & amp;) - Konstruktor benötigen, um zugänglich zu sein, habe ich recht?

Können Sie mir sagen, was mit dem Code nicht stimmt?

Mit der letzten Version von g ++ kompiliert 'g ++ -std = c ++ 0x' und 'g ++ -std = c ++ 0x-fno-elide-constructors' den Code ohne Fehler.

    
kcm1700 04.06.2012, 07:49
quelle

1 Antwort

4

Es ist ein Fehler im Optimierer. Der Compiler versucht, die Verschiebung zu egalisieren, ist aber nur so programmiert, dass er einen Kopierkonstruktor abbildet - was erfordert, dass ein Kopierkonstruktor existiert, um an erster Stelle zu sein.

Ich erinnere mich nicht, was (wenn überhaupt) das Update für diesen Fehler ist, aber es wurde möglicherweise in SP1 behoben.

    
Puppy 04.06.2012, 19:31
quelle