2011-10-11 74 views

回答

1

在链接的评论说:“整数,指针和成员指针模板参数是不是左值”(重点煤矿)。它并不是说名称整型变量不是左值 - 它们是。

如果有浮点模板参数这样的事情,那么它们也不会是左值;但名为浮点变量仍然会。

1

这与使用int作为模板参数是一个右值具体相关,但不能将浮点数用作模板参数。

例如。

template <int T> 
struct foo 
{ 
    void f(int&); 
    void f(int&&); 

    void bar() 
    { 
     int x; 
     f(x); // calls first version 
     f(T); // calls second version, despite being "named" 
    } 
}; 

template <float F> // compile error: can't use a float as a template parameter 
struct bad {}; 
1

你是什么意思的“命名值”? C++中没有这样的概念。 变量(不论其类型如何)是一个左值(当在 表达式中使用时)。在大多数情况下,引用类型的东西是 左值,除了数据类型变量以外的东西不是(但我是 肯定有人会发现一些例外);数据类型(整数 或浮点数)与它无关。

有问题的线程正在讨论非类型的模板参数。上面的规则 也适用于此处:引用是左值,其他类型不是左值,其他类型是 。由于只有非常有限的非参考类型集可以用作非类型模板参数,所以似乎会出现混淆:特别是 ,整数类型是可以的,但浮点类型不是。 因此,一个模板内,一个浮点参数必须是参考(和 从而左值),积分类型可以是一个值类型(不是 左值)或基准(左值),例如:

template <int N> 
struct A { /* N is not an lvalue */ }; 

template<int& N> 
struct B { /* N is an lvalue */ }; 

template <double N> 
struct C {}; // This is illegal, and shouldn't compile 

template <double& N> 
struct D { /* N is an lvalue */ }; 

这里的区别不在于N是否具有整型,它是 是否N是一个参考与否。