3

哪个是调用基类移动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 中工作(两个版本都不起作用)。

4

2 回答 2

3

第一个选项看起来合乎逻辑,尽管我会拼写它std::forward<Bar>(other)

我不知道是什么导致 CBuilder 认为&otherisBar&&和 not的类型Bar*

基本上这里发生的事情是,一旦右值引用被命名,它就不再是右值引用,这就是std::forward它的目的,它保持右值(创造一个短语),所以当你调用: Foo(other)你调用复制构造函数而不是移动构造函数。

这应该是实现您想要做的事情的惯用(且符合标准)方式(除非我严重误解了 FCD)。

于 2010-11-01T11:38:05.023 回答
0

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

于 2010-11-01T12:15:16.223 回答