C++ 具有未触及的非constexpr参数的constexpr:谁是正确的,clang还是gcc?
我有4个测试用例,我相信它们都是有效的: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&
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
变量。叮当声是正确的