Почему конструктор перемещения по умолчанию или оператор присваивания не созданы для производных классов? Чтобы продемонстрировать, что я имею в виду; имея эту установку кода:Переместить конструктор и оператор присваивания: почему нет дефолтных производных классов?
#include <utility>
struct A
{
A() { }
A (A&&) { throw 0; }
A& operator= (A&&) { throw 0; }
};
struct B : A
{ };
либо из следующих линий бросков:
A x (std::move (A());
A x; x = A();
, но ни один из следующих делает:
B x (std::move (B());
B x; x = B();
В случае это особенно важно, я тестировал с GCC 4.4 ,
EDIT: более поздний тест с GCC 4.5 показал то же поведение.
Есть ли что-нибудь здесь? Std :: move? Разве 'A()' уже rvalue? –
Да, это так. В противном случае стандарт C++ позволяет компилятору сжать это в just-construct-x (или так мне сказали на freenode.net). Я также проверил, что без 'std :: move' конструктор перемещения не является trigerred, поэтому комментарий freenode.net выглядит как истинный. – doublep
@Mike: Копирование elision (12.8/34, 0x FCD) является общей оптимизацией, но использование move() делает это выражение выходящим за пределы допустимых условий. – 2010-04-22 21:34:09