我遇到了一个问题。我为一个类实现了一个构造函数,但为什么隐式生成其他构造函数,比如复制一个? 我想,如果我明确定义构造函数,那么编译器不会隐式生成其他构造函数。我真的希望,这是一个特定于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);
}
请记住,这是一个示例代码,专为此情况创建,出于演示目的,我希望答案仅与此问题严格相关。
答案 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);