Вызов базового класса move ctor [C ++ 0x] - PullRequest
3 голосов
/ 01 ноября 2010

Как правильно вызывать перемещение базового класса ctor?

this (работает в MSVC2010, но не в CBuilder2010):

struct Foo
{
    Foo(Foo&& other) { }
};

struct Bar : public Foo
{
    Bar(Bar&& other) : Foo((Foo&&)other) { }
};

или (работает в CBuilder2010, но нев MSVC2010):

struct Foo
{
    Foo(Foo&& other) { }
};

struct Bar : public Foo
{
    Bar(Bar&& other) : Foo(&other) { }
};

или они оба не правы?Если да, то как правильно (с точки зрения того, что указано в стандартах C ++ 0x)?

Примечание: я не могу понять, как заставить его работать в CBuilderXE (обе версии этого не делаютработа).

Ответы [ 2 ]

3 голосов
/ 01 ноября 2010

Первый вариант выглядит логичным, хотя я бы сказал по буквам std::forward<Bar>(other).

Понятия не имею, что заставляет CBuilder думать, что тип &other равен Bar&&, а не Bar*.

По сути, здесь происходит то, что, как только ссылка на rvalue названа, она больше не является ссылкой на rvalue, для этого и используется std::forward, она поддерживает rvaluness (для добавления фразы), поэтому, когда вы вызываете : Foo(other), вы Вы вызываете конструктор копирования, а не конструктор перемещения.

Это должен быть идиоматический (и совместимый со стандартами) способ добиться того, что вы пытаетесь сделать (если только я не неправильно понимаю FCD).

0 голосов
/ 01 ноября 2010

Первый вариант является правильным с точки зрения Стандарта, за исключением того, что вам не нужно его разыгрывать, и вы должны переслать его. std::forward<Bar>(other) - правильный путь, иначе вы вызываете конструктор копирования, когда хотите вызвать конструктор перемещения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...