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.