constexpr与未触及的非constexpr争论:谁是正确的,铿锵的还是gcc?

时间:2017-03-24 11:03:50

标签: c++ c++11 c++14 constexpr

我有4个测试用例,我相信所有测试用例都是有效的:

constexpr int f(int const& /*unused*/){
    return 1;
}

void g(int const& p){
    constexpr int a = f(p); // clang error, gcc valid

    int v = 0;
    constexpr int b = f(v); // clang valid, gcc valid

    int const& r = v;
    constexpr int c = f(r); // clang error, gcc error

    int n = p;
    constexpr int d = f(n); // clang valid, gcc valid
}

int main(){
    int p = 0;
    g(p);
}

Clang和GCC仅在第一个测试案例中有所不同。

我用clang 4& 5(20170319)和GCC 7.0.1(20170221)。

如果我是对的,它会在static_assert中大量简化boost :: hana的使用。

1 个答案:

答案 0 :(得分:3)

[expr.const]/2

  

表达式e核心常量表达式,除非   根据抽象机器的规则评估e   评估以下表达式之一:

     
      
  • [...]
  •   
  • id-expression ,引用引用类型的变量或数据成员,除非引用具有先前的初始化并且   任

         
        
    • 使用常量表达式

    • 进行初始化   
    • 其生命周期始于e;

    • 的评估范围内   
  •   
  • [...]
  •   

pr都不满足任何条件。因此,f(p)f(r)都不是核心常量表达式,因此也不能用于初始化constexpr变量。 Clang是对的。