Что вы подразумеваете под "именованным значением"? В 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
является ссылкой или нет.