C ++ 11隐式复制构造函数,同时显式实现构造函数

时间:2014-11-25 16:52:44

标签: c++11 constructor copy move implicit

我遇到了一个问题。我为一个类实现了一个构造函数,但为什么隐式生成其他构造函数,比如复制一个? 我想,如果我明确定义构造函数,那么编译器不会隐式生成其他构造函数。我真的希望,这是一个特定于VC ++的东西,并且这段代码不符合ISO:IEC C ++ 11:

class Foo
{
    int bar;

public:
    Foo(int&& arg) : bar(arg) { cout << "RConstruction" << endl; }
};

int main(int, const char*[])
{
    Foo f = Foo(42);

    /* Create unused temporary on the stack */
    Foo::Foo(f); /* calling Foo::Foo(const Foo&): this shouldn't work... */

    return (0);
}

请记住,这是一个示例代码,专为此情况创建,出于演示目的,我希望答案仅与此问题严格相关。

2 个答案:

答案 0 :(得分:4)

这不是一个移动构造函数,因此它不会抑制任何隐含的构造函数。

就像Foo(const int&)不是复制构造函数一样,Foo(int&&)不是移动构造函数,它只是一个采用右值引用的构造函数。

移动构造函数看起来像以下之一:

Foo(Foo&&)
Foo(const Foo&&)
Foo(volatile Foo&&)
Foo(const volatile Foo&&)
  

我想,如果我明确定义了一个构造函数,那么编译器就不会隐式生成其他构造函数。

如果您定义任何构造函数,则编译器不会生成默认构造函数,但它仍会生成其他构造函数。如果您不想要,请将其定义为已删除:

Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;

答案 1 :(得分:3)

您没有声明一个移动构造函数,而是一个常规构造函数:不会删除任何隐式构造函数。

移动构造函数的形式为Foo(Foo&& arg)(参数上有任何cv限定符)

另请注意,此语句无效C ++:

 Foo::Foo(f);

也许你的意思是:

Foo g = Foo(f);