C++ 具有未触及的非constexpr参数的constexpr:谁是正确的,clang还是gcc?

C++ 具有未触及的非constexpr参数的constexpr:谁是正确的,clang还是gcc?,c++,c++11,c++14,constexpr,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&

我有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)进行了测试

如果我是对的,它将大大简化boost::hana在静态断言中的使用。

:

表达式
e
是核心常量表达式,除非 按照抽象机器的规则,对
e
进行评估 计算以下表达式之一:

  • [……]
  • 一种id表达式,它引用引用类型为引用的变量或数据成员,除非该引用具有前面的初始化和 或者

    • 它是用常量表达式或

    • 其寿命开始于
      e
      的评估

  • [……]
p
r
均不满足这两个条件。因此,无论是
f(p)
还是
f(r)
都不是核心常量表达式,因此都不能用于初始化
constepr
变量。叮当声是正确的