命名为int vs命名为float

时间:2011-10-11 06:12:14

标签: c++ floating-point int

here我感到有些不对劲的感觉。

命名的int不是左值而是名为float是真的吗?

3 个答案:

答案 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是否为引用。