对自己调用复制构造函数



我很好奇我几乎是错误地写的这段代码中发生了什么:

#include <iostream>
class Test
{
public:
  Test() {
    std::cout << "Default constructor";
    a= 10;
  }
  int a;
};
int main() {
  Test obj(obj);
  std::cout << obj.a << std::endl;
}

它在gcc中编译时没有任何警告(使用-Wall-Werror)。执行它只会打印垃圾。

如果我没有错的话,这是在自己上调用隐式复制构造函数,而从来没有初始化过。我很好奇复制构造函数在这种情况下会做什么,但gdb不会停在那一行(设置到那一行的断点会跳到下一行)。

如果将"复杂"属性添加到类中(如std::string),则一切都会中断,这可能是因为此类重载了'='运算符。

我的假设正确吗?为什么gdb不停在那一行?为什么用未初始化的对象调用复制构造函数时没有警告?

由于您有一个类型为int的成员变量,其不确定值被复制到自身,因此从技术上讲,代码是Undefined Behavior。

然而,在实践中,使用当前的计算机不会发生任何糟糕的事情。但从第三方面来说,也没有什么好事发生。

关于警告,这是一个实施质量问题。C++标准对此没有什么可说的。

最新更新