非类型模板参数的引用

时间:2010-09-18 12:21:15

标签: c++ templates parameters reference non-type

'非参考'类型的'非类型模板'参数有什么用?为什么这些参数也被视为'rvalues'?

template<int &n> void f(){
   &n;               // error
}

int main(){
   int x = 0;
   f<x>();
}

2 个答案:

答案 0 :(得分:4)

f<x>无效。顺便说一下,我的编译器编译你的模板化函数而没有坏的调用。

template<int &n> void f(){
   int* ptr = &n;
}

int something = 0;

int main() {
    f<something>(); // success
    int x;
    f<x>(); // C2971: Cannot pass local var to template function
}

答案 1 :(得分:0)

说实话,我想不出这种类型的构造有多大用处,虽然我确信它们可能存在。在我看来,你受到限制,因为n必须在全局范围内有效存在才能使f()有效。您可以执行以下操作:

#include <iostream>

using namespace std;

template<int &n> void sq(){
    n *= n;
}

int something = 10;

int main()
{
    cout << something << endl;
    sq<something>();
    cout << something << endl;

    return 0;
}

但我无法看到使用非模板功能无法实现的功能。 sq()可能会在编译时有效地计算出来吗?