根据cppreference(强调我的):
核心常量表达式是任何没有任何表达式的表达式 任何子表达式中的以下之一
(...)
- 一种表达,其评估会导致任何形式的核心语言 未定义的行为(包括有符号整数溢出,除以 零,数组边界外的指针算术等)。是否标准 检测到未定义的库未定义行为。
醇>
另一方面,指针上有几个表达式,其结果不是未定义但未指定(参见[expr.rel]/3)例如:
struct A {
int v;
};
struct B {
int v;
};
struct C: A, B {} c;
int main() {
constexpr bool result = &c.A::v < &c.B::v;
(void)result;
}
代码编译时gcc没有问题,但clang没有问题,这说明无疑是真的:
不同基类的子对象的地址比较具有未指定的
但是(据我所知)根据cppreference它不应该阻止编译器编译代码。
哪个编译器就在这里 - gcc还是clang?我是否过度解释了cppreference?
答案 0 :(得分:4)
除了关于UB的全部案例之外,在[expr.const]中禁止表达式列表的末尾是,
- 结果未指定的关系或相等运算符
这也出现在cppreference列表中,目前编号为#19。