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
相关产品推荐
相关产品推荐

