В особенности в связи с std::vector важно, чтобы типы были noexcept возможными.
Итак, при объявлении конструктора перемещения = default, как в
struct Object1
{
Object1(Object1 &&other) = default;
};
std::is_nothrow_move_constructible<Object1>::value будет true, так как каждый член (0 здесь) Object1 конструктив невозможен, на который отвечает здесь.
Но что произойдет, если конструктор перемещения перемещения объявлен, а затем = default, определенный как в следующем коде?
struct Object2
{
Object2(Object2 &&other);
};
Object2::Object2(Object2 &&other) = default;
С g++ 4.9.2 std::is_nothrow_move_constructible<Object2>::value есть false, и я должен отметить как объявление, так и определение как noexcept, чтобы сделать его true.
Теперь меня интересует, каковы фактические правила.
Тем более, что пункт 22 в Эффективный современный С++ (Скотт Майерс), кажется, дает плохой совет, предлагая реализовать конструктор перемещения pimpl-idiom, как я это делал с Object2.