C++ C++17 中的序列点和对评估顺序的更改
C++ sequence points and changes to evaluation order in C++17
我对 C++17 的更改如何影响不应在序列点之间修改一个变量 2 次的规则的方式有点困惑。
例如,在 C++17 中是否指定、未指定或未定义?
void func(int x, int y);
int x=47;
func(x++,x++);
我的猜测是UB。
编辑:额外的数据点:C ++ 2a模式下的clang HEAD给出
prog.cc:8:11: 警告: 对"x"的多次未排序修改 [-Wunsequenced]
编辑2:与C++2a模式下的GCC头相同
prog.cc:8:15:警告:"x"上的操作可能未定义 [-Wsequence-point]
编辑3:使用预递增GCC和Clang给出不同的结果
您问题中的示例
int x = 0;
f(x++, x++);
现在是未指定的行为,而不是未定义的行为。这意味着它是有效的代码,但实际发生的情况可能因编译器而异。
参数的计算顺序未指定,这意味着编译器可以按任何顺序计算参数,但不应调用 UB。例如,对于具有分配的参数来说,这是必要的,分配本身有副作用,但对于程序的语义,分配的顺序应该无关紧要。
class person;
// consumes 2 persons, needs to delete them later
void use_persons(person* a, person* b);
int main() {
// Alice can be allocated before or after Bob
use_persons(new person("Alice"), new person("Bob"));
}
相关文章:
- c++11评估顺序(未定义的行为)
- C++评估顺序优化是否意味着对不同的操作数使用不同的内核?
- 令人不安的评估顺序
- 函数参数计算顺序与 Lambda 捕获评估顺序
- std::apply是否为评估顺序提供保证
- 类型(x0 = y0,x1 = y1,x2 = x0,..)的括号和逗号表达中的评估顺序
- C++ C++17 中的序列点和对评估顺序的更改
- 关于使用共享指针的评估顺序
- C 17带有运营商超载功能的评估顺序
- 折叠表达式评估顺序
- C 评估顺序
- X().Y(Z()) 和标准中的评估顺序
- 评估顺序异常
- C++可变参数模板和评估顺序
- C++评估顺序:除法与加法
- 评估顺序 >> 和 [++]
- 函数参数评估顺序
- C++中分配语句的评估顺序
- 评估顺序和未定义的行为
- "IF"参数评估顺序?