C++自定义类未重载赋值运算符为何支持花括号赋值?
问题原理说明
1. 第一行代码Event e1 = {1, nullptr}的本质是初始化,不是赋值
- 这行是变量定义阶段的拷贝列表初始化,属于C++11引入的列表初始化规则范畴,和你有没有重载
=运算符完全无关。 - 非聚合类型也支持列表初始化:只要花括号内的参数列表能匹配到类的公开构造函数,就能完成初始化。你定义的
Event(int t, Bar* p)刚好匹配两个参数的传入类型,编译器直接调用这个构造函数完成e1的构造,不会触发赋值逻辑。
补充验证:如果你给两参数构造函数加上
explicit修饰符,这行代码就会编译失败,因为explicit构造函数禁止被用于拷贝列表初始化。
2. 第二行代码mp[1] = {1, nullptr}是赋值场景,本质是隐式构造临时对象
- 这里
mp[1]返回的是已经默认构造好的Event左值引用,确实触发的是赋值逻辑。 - 花括号
{1, nullptr}在这里是无类型的初始化列表,会优先尝试隐式构造一个Event类型的临时对象(调用你写的两参数构造函数),再用编译器自动生成的默认拷贝赋值运算符,把临时对象的内容赋值给mp[1]对应的实例。
补充验证:同样如果给两参数构造函数加
explicit,这行也会编译失败,因为explicit禁止隐式构造临时对象。
内容的提问来源于stack exchange,提问作者kz28
相关产品推荐
相关产品推荐

