相关疑难解决方法(0)

重载逗号运算符*是否真的影响其操作数的评估顺序?

逗号运算符保证从左到右的评估顺序.

[n3290: 5.18/1]:逗号运算符从左到右分组.

expression:
   assignment-expression
   expression , assignment-expression
Run Code Online (Sandbox Code Playgroud)

用逗号分隔的一对表达式从左到右进行评估 ; 左表达式是废弃的值表达式(第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

14
推荐指数
1
解决办法
838
查看次数

C++标准究竟在哪里说取消引用未初始化的指针是未定义的行为?

到目前为止,我无法找到如何推断以下内容:

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++ standards undefined-behavior language-lawyer

11
推荐指数
5
解决办法
3494
查看次数

是否允许C++编译器在遇到被归类为未定义行为的构造时发出随机代码?

可能重复:
未定义,未指定和实现定义的行为

我正在努力加深对C++中未定义行为的理解.假设C++编译器会故意检测某些未定义行为的情况 - 例如,在两个序列点之间修改变量两次:

x++ = 2;
Run Code Online (Sandbox Code Playgroud)

一旦该虚构的编译器可靠地检测到这种情况,它就会发出十个完全随机的机器指令到生成的机器代码中.

根据C++标准,无论什么东西被归类为UB,对发生的事情都没有要求.所描述的虚构编译器是否符合C++标准?

c++ undefined-behavior

0
推荐指数
1
解决办法
372
查看次数