我有一个关于C ++语法/构造的查询:在什么情况下可以调用以下Foo(Foo x){}? 我知道它不会被称为初始化,因为它们会调用复制构造函数
Foo a;
Foo x = a;
or
Foo x(a);
不是为了转换类型,因为传递给它的参数与类
的类型相同无法想到调用Foo(Foo x){}的场景,或者它将永远是死代码。
class Foo {
public :
Foo(Foo x){ // notice it is not not a Copy constructor!!, i intented it to make like ordinary ctor taking same class object
}
Foo(int x) : m_data(x){}
private :
int m_data;
};
答案 0 :(得分:11)
你真的试过编译这段代码吗?
Error 1 error C2652: 'Foo' : illegal copy constructor: first parameter must not be a 'Foo' main.cpp 5 1 NativeConsoleSketchbook
如果类X的构造函数的第一个参数是类型(可选择cv限定),则该构造函数的声明格式不正确 X并且没有其他参数,或者所有其他参数都有默认参数。
答案 1 :(得分:3)
引自this维基百科的文章(强调我的):
以下是无效的副本构造函数(原因 - copy_from_me是 未作为参考传递):
X(X copy_from_me);
X(const X copy_from_me);因为对这些构造函数的调用也需要一个副本, 这将导致无限递归调用。
答案 2 :(得分:2)
Foo(Foo x)
将永远不会被调用,因为代码会尝试将其解释为复制构造函数并失败(编译错误)。
非类型方法(如构造函数,析构函数等)应遵循每种情况的语法。