我有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的使用。
答案 0 :(得分:3)
表达式
e
是核心常量表达式,除非 根据抽象机器的规则评估e
评估以下表达式之一:
- [...]
id-expression ,引用引用类型的变量或数据成员,除非引用具有先前的初始化并且 任
- 进行初始化
使用常量表达式
- 的评估范围内
其生命周期始于
e
;- [...]
p
或r
都不满足任何条件。因此,f(p)
和f(r)
都不是核心常量表达式,因此也不能用于初始化constexpr
变量。 Clang是对的。