2015-02-22 13 views
15

Besonders in Verbindung mit std::vector ist es wichtig, dass die Typen noexcept wenn möglich beweglich sind.Welche Regeln gelten für noexcept bei default-definierten Move-Konstruktoren?

Also, wenn eine Bewegung Konstruktor deklarieren = default wie in

struct Object1 
{ 
    Object1(Object1 &&other) = default; 
}; 

std::is_nothrow_move_constructible<Object1>::value wird true wie jedes Mitglied (0 hier) sein von Object1 ist nothrow-move-konstruierbar, die here beantwortet wird.

Was passiert aber, wenn der Move Copy-Konstruktor erst deklariert wird und später = default wie im folgenden Code definiert wird?

struct Object2 
{ 
    Object2(Object2 &&other); 
}; 
Object2::Object2(Object2 &&other) = default; 

mit g ++ 4.9.2 std::is_nothrow_move_constructible<Object2>::value ist false und ich habe sowohl die Deklaration und die Definition als noexcept markieren, um es true zu machen.

Was mich interessiert, ist, was die tatsächlichen Regeln sind. Vor allem seit Artikel 22 in Effective Modern C++ (Scott Meyers) scheint schlecht beraten, indem sie vorschlagen, die pimpl-idiom Move-Konstruktor wie ich mit Object2 zu implementieren.

Antwort

11

[dcl.fct.def.default]/p2:

Wenn eine Funktion explizit auf seiner ersten Erklärung vorbelegt ist,

  • es implizit sein constexpr, wenn die implizite Deklaration betrachtet wäre, und
  • es hat die gleiche Ausnahmebedingung, als ob es implizit deklariert worden wäre (15.4).

Diese Regeln gelten nicht, wenn die Funktion explizit auf eine spätere Erklärung Verzug geraten ist, wie in Ihrem späteren Beispiel, also statt, mit Ausnahme von Destruktoren wird die Funktion noexcept(false) standardmäßig wie die meisten anderen Funktionen betrachtet.

Da die explizite säumig in einer anderen Übersetzungseinheit sein kann - und im Pimpl Fall ist in einer anderen TU - es gibt keine allgemeine Möglichkeit für den Compiler nur, nachdem er, ob der Umzug Konstruktor die Klassendefinition, um herauszufinden, wird geworfen, es sei denn, die Funktion ist explizit in der Klassendefinition voreingestellt (dh bei ihrer ersten Deklaration).