2010-04-22 2 views
6

Почему конструктор перемещения по умолчанию или оператор присваивания не созданы для производных классов? Чтобы продемонстрировать, что я имею в виду; имея эту установку кода:Переместить конструктор и оператор присваивания: почему нет дефолтных производных классов?

#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 показал то же поведение.

+1

Есть ли что-нибудь здесь? Std :: move? Разве 'A()' уже rvalue? –

+0

Да, это так. В противном случае стандарт C++ позволяет компилятору сжать это в just-construct-x (или так мне сказали на freenode.net). Я также проверил, что без 'std :: move' конструктор перемещения не является trigerred, поэтому комментарий freenode.net выглядит как истинный. – doublep

+2

@Mike: Копирование elision (12.8/34, 0x FCD) является общей оптимизацией, но использование move() делает это выражение выходящим за пределы допустимых условий. – 2010-04-22 21:34:09

ответ

6

Чтение через 12.8 в 0x FCD (12.8/17, в частности, для перемещения ctor), это, похоже, ошибка GCC. Я вижу то же самое, что и в 4.5, как и в 4.4.

Возможно, мне не хватает углового футляра для удаленных функций или чего-то подобного, но я пока не вижу никаких признаков этого.

+0

Просто протестированный с 4.5, я получаю те же результаты. Можете ли вы протестировать любой другой компилятор? (Учитывая, что C++ 0x никоим образом не закончен, это может быть не ошибка, а, скорее, устаревшее поведение, кстати.) – doublep

+3

Куча вещей в 12.8 (из N3053) не поддерживается в 'gcc' однако, согласно их [странице поддержки C++ 0x] (http://gcc.gnu.org/projects/cxx0x.html) - может ли это быть проблемой? –

+0

@Mike: Похоже, да. – 2010-04-22 21:23:38