6

根据cppreference(强调我的):

核心常量表达式是在任何子表达式
(...) 中不包含以下任何一项的任何表达式

  1. 一个表达式,其评估会导致任何形式的核心语言未定义行为(包括有符号整数溢出、被零除、数组边界外的指针算术等)。未指定是否检测到标准库未定义行为。

另一方面,指针上有几个表达式,其结果不是未定义但未指定(参见[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?

4

1 回答 1

4

除了关于 UB 的包罗万象的情况外,在 [expr.const] 中禁止表达式列表的末尾是,

— 结果未指定的关系或等式运算符

这也出现在 cppreference 列表中,当前编号为 #19。

于 2017-03-03T09:42:30.860 回答