为什么非类型引用的template参数不能是另一个引用(g++ 4.8.1):

template <int& N> void test() { }

int x = 5;
int& p = x;

int main(){
    test<x>(); //compiles fine
    test<p>(); //error: could not convert template argument 'p' to 'int&'|
}

我看不到标准p违反了什么地方,这些地方似乎是最相关的部分(N3337):


p应该被视为左值吗?我唯一想到的另一件事可能是缺少引用的链接,但是添加extern int& p = x也无法解决该问题。

最佳答案

这与前面的问题template instantiation with constexpr function failure有关,尽管您的情况有所不同,但我在评论中已链接到该问题。

看起来该示例以前是不允许的,但是通过提案Allow constant evaluation for all non-type template arguments将该支持添加到C++ 1z中,该提案以以下内容打开:



似乎与您的情况有关的特定更改是将C++标准部分草案14.3.2模板非类型参数[temp.arg.nontype] / p1的措辞改写为:



至:



并对5.20节常量表达式[expr.const] / p4进行了更改,其中以下段落介绍了转换后的常量表达式,其开头为:



特别是添加了:



注意,当前的头版clang在C++ 1z模式see it live下编译您的代码。

N4268的更新版本是所应用的版本,而clang C++1z implementation status section表明该文件受clang 3.6支持。这段代码仅适用于c++ 3.6和更高版本的C++ 1z模式。

07-28 08:43