You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:36:04