【发布时间】:2020-05-21 02:25:34
【问题描述】:
#include <iostream>
constexpr int func2(int const& id){
return id;
}
template<int v>
struct Test{
};
int main(){
const int v = 0;
Test<func2(v)> c;
}
考虑上面的代码,我只是不明白为什么代码格式正确。我的观点是名称v在评估表达式func2时用作glvalue,因为func2的参数是引用类型,v 需要绑定到 id-expression id。所以我们看一下 glvalue 常量表达式的要求,这里是关于它的引用。
常量表达式要么是泛指值核心常量表达式,它引用作为常量表达式(如下定义)的允许结果的实体,要么是值满足以下约束的纯右值核心常量表达式。
我们忽略了prvalue的情况,因为这里v被用作glvalue。
一个实体是一个常量表达式的允许结果是:
如果实体是具有静态存储持续时间的对象,该对象要么不是临时对象,要么是其值满足上述约束条件的临时对象,或者它是常量表达式的允许结果是一个函数。
在我的程序部分,const int v = 0;没有静态存储时长,它只有自动存储时长。所以在评估表达式func2(v)以确定它是否是一个常量表达式时,首先,v 必须是一个泛左值核心常量表达式,它指的是一个实体,它是一个常量表达式的允许结果,因此,为什么这里的程序格式正确?如果我丢失了任何重要的引用,请纠正我。
【问题讨论】:
标签: c++ language-lawyer