【发布时间】: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