Именованный int против названного float - PullRequest
0 голосов
/ 11 октября 2011

С здесь У меня смешанные чувства, что что-то не так.

Правда ли, что named int не lvalue, а named float?

Ответы [ 3 ]

1 голос
/ 11 октября 2011

Комментарий в ссылке говорит: «целое число, указатель и указатель на член параметры шаблона не являются значениями» (выделено мной).Он не говорит, что именованные целочисленные переменные не являются lvalues ​​- они есть.

Если бы существовала такая вещь, как параметры шаблона с плавающей запятой, то они также не были бы lvalue;но именованные переменные с плавающей точкой по-прежнему будут.

1 голос
/ 11 октября 2011

Что вы подразумеваете под "именованным значением"? В C ++ такого понятия нет. Переменная (независимо от ее типа) является lvalue (когда используется в выражение). В большинстве случаев вещи со ссылочными типами lvalues, вещи, отличные от переменных с типами данных, не являются (но я уверен, кто-то найдет некоторые исключения); опять же тип данных (целое число или с плавающей запятой) не имеет к этому никакого отношения.

В обсуждаемой ветке обсуждаются нетиповые параметры шаблона. вышеупомянутое правило применимо и здесь: ссылки являются lvalues, другие типы не lvalues. Путаница, кажется, происходит, потому что только очень ограниченный Набор нереферентных типов может быть использован в качестве нетиповых параметров шаблона: в частности, целочисленные типы в порядке, а типы с плавающей точкой - нет. Таким образом, в шаблоне аргумент с плавающей точкой должен быть ссылкой (и таким образом, lvalue), целочисленный тип может быть типом значения (не lvalue) или ссылка (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 является ссылкой или нет.

1 голос
/ 11 октября 2011

Это конкретно связано с использованием int в качестве параметра шаблона, являющегося значением r, в то время как вы не можете использовать 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 {};
...