没有默认构造函数的奇怪的 c++ 复制构造函数

Weird c++ copy constructor without default constructor

我和我的一个同事争论过是否

Pt pt;

Pt pt = Pt(); 

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

在我们 运行 我们的小实验中,我决定测试一个奇怪的位,我的同事认为它甚至无法编译:

//here the compiler calls a copy constructor and doesn't call the default constructor prior to that
// O_o
Pt pt = pt;

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

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

Pt pt = pt;

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

考虑到这一点,会发生以下情况:

  1. Pt pt = -> 此时,创建了Pt对象,命名为pt(此时没有初始化)
  2. = pt; -> 此时,pt 的复制构造函数被调用,参数为 - 本身 (pt)
  3. 因为 pt 已创建但未初始化(在 1. 中),这是(有点)有效 - pt 的复制构造函数(在 2. 中)将被 "properly" 执行,将已经存在且 未初始化的 对象作为右侧参数 pt (再次来自 1.

不久 - 这很糟糕。

值得注意的是,如果 pt 对象是全局的或静态的,它 在第 1. 步默认初始化 - 在达到=.

编辑:关于最初的"puzzle"Pt pt = Pt();,你可以看到这个问题:Is there a difference in C++ between copy initialization and direct initialization?及其接受的答案。 这个看起来也很有趣:How variable is initialized by default constructor in c++