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

C++中用赋值表达式返回值初始化变量是否为未定义行为?含std::map场景

关于C++赋值表达式初始化变量的问题解答

1. 使用赋值表达式返回的值来初始化变量是否属于未定义行为?

不属于未定义行为。C标准明确规定,赋值表达式会先完成赋值操作,再返回目标对象的引用(C11及以后标准)或值(更早标准),用这个返回值初始化变量的行为完全合法且可预测,不存在未定义行为。

2. 以下代码是否为C++标准规定的未定义行为?

int fingers = 10;
int more = (fingers = 10);
// or 
// int more = fingers = 10;

不是未定义行为。赋值运算符是右结合的,执行顺序清晰:

  • 先执行fingers = 10,将10赋值给fingers;
  • 该赋值表达式返回fingers的引用(C++11+)或值;
  • 用这个返回值初始化more,最终fingers和more的值都是10,行为完全确定。

3. 上述问题的答案是否同样适用于std::map?

std::map<int, int> arms;
int bicep = (arms[200] = 10);

同样适用,不存在未定义行为。std::map::operator[]的执行逻辑明确:

  • 如果键200不存在,会先插入一个值为0(int的默认初始化值)的元素;
  • 返回该元素的引用,随后执行arms[200] = 10将元素值改为10;
  • 这个赋值表达式返回该元素的引用,用来初始化bicep,最终bicep的值为10,map中键200对应的元素值也是10,行为完全可预测。

内容的提问来源于stack exchange,提问作者Cuadrix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:37:09