在C++23中,
这将编译成与
然而,如果存在另一种未定义行为的层次,会发生什么呢?
现在假设中有UB,但是这个假设没有被评估。 这是什么意思?只是胡言乱语还是编译器可以对这个假设做些什么?
[[assume(expression)]]
属性使得如果expression为false
,行为将变得未定义。
例如:int div(int x, int y) {
[[assume(y == 1)]];
return x / y;
}
这将编译成与
y
始终为 1
相同的代码。div(int, int):
mov eax, edi
ret
然而,如果存在另一种未定义行为的层次,会发生什么呢?
int div(int x, int y) {
[[assume(x / 0 == 1)]];
return x / y;
}
现在假设中有UB,但是这个假设没有被评估。 这是什么意思?只是胡言乱语还是编译器可以对这个假设做些什么?
true
,因为标准对未定义行为没有任何要求。它甚至可能产生一个明确记录的结果,可以是true
,并且这仍然是符合规范的。 - Ruslan