根据cppreference(重点是我的):



另一方面,指针上有几个表达式,其结果不是不确定的,而是未指定(cf. [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?

最佳答案

除了关于UB的所有情况之外,[expr.const]中的禁止表达式列表的末尾还有,



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

10-06 04:10