没有默认构造函数的奇怪的c ++拷贝构造函数

mr.*_*.pd 9 c++ copy-constructor default-constructor

我和我的一位同事讨论过关于他人的问题

Pt pt;
Run Code Online (Sandbox Code Playgroud)

Pt pt = Pt(); 
Run Code Online (Sandbox Code Playgroud)

是等价的.我怀疑在第二种情况下可以调用复制分配,但事实证明并非如此.

当我们进行我们的小实验时,我决定测试一个奇怪的位,我的同事认为甚至不会编译:

//here the compiler calls a copy constructor and doesn't call the default constructor prior to that
// O_o
Pt pt = pt;
Run Code Online (Sandbox Code Playgroud)

以下是一个工作示例:http://ideone.com/XmJSz7

所以,问题是 - 发生了什么:

Pt pt = pt;
Run Code Online (Sandbox Code Playgroud)

Kir*_*rov 5

构造如type object = something调用复制构造函数,而不是赋值运算符

考虑到这一点,这是发生的事情:

  1. Pt pt =- >此时,Pt创建对象,命名pt(此时没有任何内容被初始化)
  2. = pt;- >此时,pt使用参数调用复制构造函数 - 本身(pt)
  3. pt创建但未初始化(in 1.),这是(有点)有效 - pt复制构造函数(in 2.)将被"正确"执行,将已存在和未初始化的对象作为右手参数pt(1.再次)

不久 - 这很糟糕.

值得一提的是,如果该pt对象是全球性的或静态的,这是默认初始化步骤1.-到达后=.

编辑:关于最初的"谜题" Pt pt = Pt();,你可以看到这个问题:复制初始化和直接初始化之间的C++是否存在差异?和它接受的答案.而这一点似乎也很有趣:如何在c ++中使用默认构造函数初始化变量