根据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?