哪种方法可以调用基类移动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中运行(两个版本都不起作用)。
答案 0 :(得分:3)
第一个选项看似合乎逻辑,虽然我拼写为std::forward<Bar>(other)
。
我不知道是什么原因导致CBuilder认为&other
的类型是Bar&&
而不是Bar*
。
基本上这里发生的事情是,一旦rvalue引用被命名,它就不再是rvalue引用,这就是std::forward
的用途,它保持rvaluness(用于拼写短语),所以当你调用{{ 1}}你正在调用复制构造函数而不是移动构造函数。
这应该是实现你想要做的事情的惯用(和标准兼容)方式(除非我误解了FCD)。
答案 1 :(得分:0)
第一个选项是标准方面的正确选项 - 除了你不应该投射它而你应该转发它。 std::forward<Bar>(other)
是正确的方法 - 否则,当你想调用移动构造函数时,你正在调用复制构造函数。