我有 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 的使用。
[表达式.const]/2 https://timsong-cpp.github.io/cppwp/expr.const#2:
一种表达e
is a 核心常量表达式除非
评估e
,遵循抽象机的规则,将
评估以下表达式之一:
这两个条件都不满足p
or r
。因此既不f(p)
nor f(r)
是一个核心常量表达式,因此两者都不能用于初始化constexpr
多变的。叮当是正确的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)