【问题标题】:Calling copy constructor on yourself自己调用复制构造函数
【发布时间】:2015-02-18 18:17:37
【问题描述】:

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

#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 不在该行停止?为什么在调用带有未初始化对象的复制构造函数时没有警告?

【问题讨论】:

  • 我怀疑存在未定义的行为,因为使用了未初始化的对象。
  • “为什么在调用带有未初始化对象的复制构造函数时没有警告?”在 C++ 中你可以做很多愚蠢的事情,编译器编写者的工作不是把它们都捕捉到。
  • @Slavia,在这种情况下,我认为编译器应该给出一个错误,而不是别的。在编译时,它具有理解这是一个错误所需的所有信息。为什么不检测呢?

标签: c++ gdb copy-constructor


【解决方案1】:

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

但是,在实践中,使用当前的计算机不会发生任何坏事。但另一方面,也没有什么好事发生。

关于警告,这是实施质量问题。 C++ 标准对此无话可说。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 2021-07-09
    • 1970-01-01
    • 2021-05-14
    • 2013-01-11
    • 2018-10-17
    • 1970-01-01
    • 2017-02-08
    相关资源
    最近更新 更多