会不会用C ++调用Foo(Foo x){}?

时间:2013-07-22 05:20:02

标签: c++

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

3 个答案:

答案 0 :(得分: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并且没有其他参数,或者所有其他参数都有默认参数。

答案 1 :(得分:3)

引自this维基百科的文章(强调我的):

  

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

     

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

     

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

答案 2 :(得分:2)

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

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