逗号运算符保证从左到右的评估顺序.
[n3290: 5.18/1]:逗号运算符从左到右分组.Run Code Online (Sandbox Code Playgroud)expression: assignment-expression expression , assignment-expression用逗号分隔的一对表达式从左到右进行评估 ; 左表达式是废弃的值表达式(第5条).在与右表达式相关联的每个值计算和副作用之前,对与左表达式相关联的每个值计算和副作用进行排序.结果的类型和值是右操作数的类型和值; 结果与右操作数具有相同的值类别,如果右操作数是glvalue和位域,则是一个位域.
关于运营商的唯一其他条款没有提到评估顺序.因此,当操作员过载时,情况似乎仍然存在.
但是,接下来,在关于表达式的一般方面,当然,当你重载运算符时,规则会发生变化:
[n3290: 5/2]:[ 注意:操作符可以重载,也就是说,当应用于类类型(第9节)或枚举类型(7.2)的表达式时,它们具有意义.重载运算符的使用将转换为函数调用,如13.5中所述.重载运算符遵循第5章中指定的语法规则,但操作数类型,值类别和评估顺序的要求将替换为函数调用的规则.运算符之间的关系(例如++a含义a+=1)不能保证重载运算符(13.5),并且不保证类型的操作数bool.- 尾注 ]
但是,这是非规范性文本.是否有任何规范性文本定义此规则,或者兼容的编译器是否可以忽略它?
c++ operator-overloading operator-precedence comma-operator language-lawyer
到目前为止,我无法找到如何推断以下内容:
int* ptr;
*ptr = 0;
Run Code Online (Sandbox Code Playgroud)
是未定义的行为.
首先,有5.3.1/1表示这*意味着转换T*为的间接T.但这对UB没有任何说明.
然后经常引用3.7.3.2/4说在非空指针上使用解除分配函数会使指针无效,之后无效指针的使用是UB.但是在上面的代码中没有关于释放的内容.
如何在上面的代码中推导出UB?
可能重复:
未定义,未指定和实现定义的行为
我正在努力加深对C++中未定义行为的理解.假设C++编译器会故意检测某些未定义行为的情况 - 例如,在两个序列点之间修改变量两次:
x++ = 2;
Run Code Online (Sandbox Code Playgroud)
一旦该虚构的编译器可靠地检测到这种情况,它就会发出十个完全随机的机器指令到生成的机器代码中.
根据C++标准,无论什么东西被归类为UB,对发生的事情都没有要求.所描述的虚构编译器是否符合C++标准?