Kann ich eine standardmäßige spezielle Member-Funktion als except-Ausnahme festlegen?

8

Die folgende Struktur kann nicht unter C ++ 11 kompiliert werden, da ich den Verschiebezuweisungsoperator als noexcept :

deklariert habe %Vor%

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?

    
marack 11.09.2013, 00:43
quelle

2 Antworten

4
  

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

zwingt %Vor%

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 .

    
Jonathan Wakely 02.12.2013, 14:36
quelle
1

Ich glaube nicht, dass Sie etwas erzwingen können, aber Sie können es verpacken:

%Vor%

(Danke Jonathan Wakely)

    
Dieter Lücking 02.12.2013 15:25
quelle

Tags und Links