Die folgende Struktur kann nicht unter C ++ 11 kompiliert werden, da ich den Verschiebezuweisungsoperator als noexcept
:
Der Standard-Bewegungszuweisungsoperator, der vom Compiler generiert wird, ist noexcept(false)
, da die Bewegungszuweisung von std::vector<int>
auch noexcept(false)
ist. Dies ist wiederum darauf zurückzuführen, dass der Standardzuordner std::allocator_traits<T>:: propagate_on_container_move_assignment
auf std::false_type
festgelegt hat. Siehe auch diese Frage .
Ich glaube, das wurde in C ++ 14 behoben (siehe Bibliotheksdefekt 2103 ).
Meine Frage ist, gibt es eine Möglichkeit für mich, noexcept
auf den Standardzuweisungszuweisungsoperator zu setzen, ohne ihn selbst definieren zu müssen?
Wenn das nicht möglich ist, gibt es eine Möglichkeit, die std::vector<int>
so zu manipulieren, dass noexcept
move zuweisbar ist, so dass noexcept(true)
an meine Struktur übergeben wird?
Ich glaube, das wurde in C ++ 14 behoben (siehe Bibliotheksdefekt 2103).
Als eine DR sollte diese Korrektur als eine Korrektur zu C ++ 11 betrachtet werden und so haben einige C ++ 11 Implementierungen es bereits behoben.
Meine Frage ist, gibt es eine Möglichkeit für mich,
noexcept
auf den Standardzuweisungszuweisungsoperator zu setzen, ohne ihn selbst definieren zu müssen?
Damit der Zuweisungsoperator für vorgegebene Bewegungen noexcept
ist, müssen Sie seinen Unterobjekten noexcept
move Zuweisungsoperatoren geben.
Der offensichtlichste portable Weg, den ich mir vorstellen kann, ist die Verwendung eines Wrappers um std::vector
, der die Bewegung zu noexcept
Eine weitere ähnliche Option besteht darin, Ihren eigenen Zuordnungstyp mit dem DR 2013-Fix zu definieren und Folgendes zu verwenden:
%Vor% Eine andere Option ist die Verwendung einer Standardbibliotheksimplementierung wie GCCs, die die Auflösung in DR 2013 implementiert, und macht std::vector
den Zuweisungsoperator noexcept
für andere Zuordnungstypen, wenn bekannt ist, dass alle Zuweisungsinstanzen gleich sind .
Ich glaube nicht, dass Sie etwas erzwingen können, aber Sie können es verpacken:
%Vor%(Danke Jonathan Wakely)