从here我感到有些不对劲的感觉。
命名的int不是左值而是名为float是真的吗?
答案 0 :(得分:1)
这与使用int作为rvalue的模板参数特别相关,而你不能使用float作为模板参数。
例如
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 :(得分:1)
链接中的注释说“整数,指针和成员指针模板参数不是左值”(强调我的)。它并没有说命名整数变量不是左值 - 它们是。
如果存在浮点模板参数这样的东西,那么它们也不会是左值;但命名的浮点变量仍然是。
答案 2 :(得分:1)
“命名值”是什么意思?在C ++中没有这样的概念。 变量(不论其类型)是左值(当用于 表达)。在大多数情况下,引用类型的东西是 左值,除数据类型的变量之外的东西不是(但我是 确定有人会发现一些例外);再次,数据类型(整数 或浮点)与它无关。
有问题的线程正在讨论非类型模板参数。该 以上规则也适用于此:引用是左值,其他类型是 不是左值。似乎发生了混乱,因为只是非常有限 非引用类型集可用作非类型模板参数: 特别是,整数类型是可以的,但浮点类型不是。 因此,在模板中,浮点参数必须是引用(和 因此,左值),整数类型可以是值类型(不是 左值(lvalue)或参考值(左值),例如:
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
是否为引用。