В особенности в связи с 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
.