Explizit voreingestellte Konstruktoren in einer leeren und nicht leeren Struktur

9

Das folgende Programm kompiliert nur, wenn ich das -DA=1 -Flag an den Compiler übergebe:

%Vor%

Wenn -DA=0 übergeben wird, schlägt die Kompilierung mit folgendem Fehler fehl:

%Vor%

Schau es dir auf Coliru an.

Es scheitert bei der Verwendung von GCC 4.9 oder Clang 3.4.

Beeinflusst das Vorhandensein einer Elementvariablen das Verhalten explizit vordefinierter Konstruktoren?

Aktualisieren

Ich habe stdlibc ++ sowohl für GCC als auch für Clang verwendet. Der Code kompiliert bei Verwendung von Clang 3.4 und libc ++.

    
StackedCrooked 09.07.2014, 00:54
quelle

1 Antwort

4

Diese Version von std::move ist:

%Vor%

OutputIterator Eigenschaften sind definiert durch [output.iterators], insbesondere muss der folgende Ausdruck gültig sein:

%Vor%

wobei r der Ausgabe-Iterator ist.

Aufgrund der von Coliru angezeigten Fehlermeldungen sieht es so aus, als ob die Bibliothek std::is_copy_assignable<element> überprüft, was natürlich falsch ist.

Dies scheint ein Fehler zu sein; Die Verschiebung sollte mit dem move-assignment-Operator funktionieren.

Vergleichen Sie Folgendes in demselben Coliru:

%Vor%

Die Definition von std::move (3 Argumente) schließt ein, dass für jeden Index *(result + n) = std::move( *(first + n) ); ausgeführt wird. Wenn also meine erste Zeile gültig ist, sollte auch meine zweite Zeile gültig sein.

    
M.M 09.07.2014 01:39
quelle

Tags und Links