W szczególności w związku z std::vector
ważne jest, aby typy były ruchome, o ile to możliwe.Jakie są zasady dotyczące noexcept w domyślnych zdefiniowanych konstruktorach ruchu?
więc podczas deklarowania konstruktora ruch = default
jak w
struct Object1
{
Object1(Object1 &&other) = default;
};
std::is_nothrow_move_constructible<Object1>::value
będzie true
jak każdego członka (0 tutaj) od Object1
jest nothrow-move-constructible, który odpowiedział here.
Co się stanie, jeśli konstruktor kopiowania ruchu zostanie zadeklarowany, a następnie zdefiniowany jako = default
jak w poniższym kodzie?
struct Object2
{
Object2(Object2 &&other);
};
Object2::Object2(Object2 &&other) = default;
Z g ++ 4.9.2 std::is_nothrow_move_constructible<Object2>::value
jest false
i muszę zaznaczyć zarówno deklaracji i definicji jako noexcept
aby to true
.
Teraz interesują mnie rzeczywiste zasady. Zwłaszcza, że Pozycja 22 w Effective Modern C++ (Scott Meyers) wydaje się udzielać złych rad, sugerując implementację konstruktora ruchu pimpl-idiom, tak jak zrobiłem to z Object2
.