对自己调用复制构造函数
Calling copy constructor on yourself
我很好奇我几乎是错误地写的这段代码中发生了什么:
#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++标准对此没有什么可说的。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 使用复制构造函数复制双精度数组
- C 无可行的构造函数复制类型的变量
- 没有可行的构造函数复制类型 'MyString' 的数组元素
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- C 11矢量构造函数复制与范围
- 我定义了一个非复制构造函数;复制构造函数还会被隐式定义吗
- 可以将构造函数复制为转换运算符
- 将基类指针的构造函数复制到子类
- C++树类:构造函数/复制/内存泄漏
- 如何制作这个在模板构造函数复制中使用类型定义的类型的模板
- 将构造函数复制为模板化的成员函数
- 绕过私有复制构造函数/复制赋值C++
- C++通过构造函数复制对象
- 复制构造函数 - 复制C++中的对象
- 将带unique_ptr的类的构造函数复制到作为成员的抽象类