调用基类移动ctor [C ++ 0x]

时间:2010-11-01 10:18:17

标签: c++ c++11 rvalue-reference move-semantics

哪种方法可以调用基类移动ctor?

这个(适用于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 个答案:

答案 0 :(得分:3)

第一个选项看似合乎逻辑,虽然我拼写为std::forward<Bar>(other)

我不知道是什么原因导致CBuilder认为&other的类型是Bar&&而不是Bar*

基本上这里发生的事情是,一旦rvalue引用被命名,它就不再是rvalue引用,这就是std::forward的用途,它保持rvaluness(用于拼写短语),所以当你调用{{ 1}}你正在调用复制构造函数而不是移动构造函数。

这应该是实现你想要做的事情的惯用(和标准兼容)方式(除非我误解了FCD)。

答案 1 :(得分:0)

第一个选项是标准方面的正确选项 - 除了你不应该投射它而你应该转发它。 std::forward<Bar>(other)是正确的方法 - 否则,当你想调用移动构造函数时,你正在调用复制构造函数。