1

我有一个关于 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;
};
4

3 回答 3

11

你真的试过编译这段代码吗?

Error   1   error C2652: 'Foo' : illegal copy constructor: first parameter must not be a 'Foo'  main.cpp    5   1   NativeConsoleSketchbook

C++11 标准,12.8.6:

如果类 X 的第一个参数是类型(可选 cv 限定)X 并且没有其他参数或者所有其他参数都具有默认参数,则类 X 的构造函数声明是格式错误的。

于 2013-07-22T05:24:51.360 回答
3

引用这篇维基百科文章(强调我的):

以下是无效的复制构造函数(原因 - copy_from_me 未作为参考传递):

X(X copy_from_me);
X(const X copy_from_me);

因为对这些构造函数的调用也需要一个副本,这将导致无限递归调用

于 2013-07-22T05:27:26.750 回答
2

Foo(Foo x)永远不会被调用,因为代码会尝试将其解释为复制构造函数并失败(编译错误)。

非类型方法(例如构造函数、析构函数等)应遵循每种情况的语法。

于 2013-07-22T05:28:26.707 回答