是否可以在constexpr上下文中使用指针导致未指定(未定义!)的行为?

时间:2017-03-03 09:29:06

标签: c++ c++11 language-lawyer constexpr unspecified-behavior

根据cppreference(强调我的):

  

核心常量表达式是任何没有任何表达式的表达式   任何子表达式中的以下之一
  (...)

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

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

1 个答案:

答案 0 :(得分:4)

除了关于UB的全部案例之外,在[expr.const]中禁止表达式列表的末尾是,

  

- 结果未指定的关系或相等运算符

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