我在草稿N4268下面划线的部分看到了一个叫做“未命名左值”的概念
[ 注意:
临时对象、未命名左值和没有链接的命名左值当相应的模板参数具有引用类型时,临时对象不是可接受的模板参数。 [示例:...]]
我搜索了很多,但 stackoverflow 和 google 都没有给我答案。 我只找到了这篇关于价值类别的帖子
但这并没有帮助。
并非所有左值表达式都有名称。事实上,N4296 中的措辞给了我们一些例子:
对于引用或指针类型的非类型模板参数, 常量表达式的值不应引用(或对于指针 类型,不得是地址):
- 子对象 (1.8),
- 临时对象(12.2),
- 字符串文字 (2.14.5),
- typeid 表达式 (5.2.8) 的结果,或
- 预定义的 func 变量 (8.4.1)。
此外,cppreference关于值类别的信息详细介绍了左值:
左值是标识非临时对象或对象的表达式 非成员函数。
以下表达式是左值:
作用域内变量或函数的名称,无论类型如何,例如 std::cin 或 std::endl。即使变量的类型是右值 引用,由其名称组成的表达式是左值 表情。
如果函数或重载运算符的返回类型是左值引用,则为函数调用或重载运算符表达式,例如 std::getline(std::cin, str) 或 std::cout << 1 or str1 = str2 or ++iter
内置预自增和预自减、解引用、赋值和复合赋值、下标(数组 xvalue 除外)、成员 访问(xvalues 的非静态非引用成员除外,成员 枚举器和非静态成员函数),通过成员访问 如果左侧操作数是左值,则指向数据成员的指针,逗号 运算符(如果右侧操作数是左值)、三元条件 if 第二个和第三个操作数是左值。
将表达式转换为左值引用类型。
字符串文字
但是,这一切都无关紧要,因为更改的范围是提案允许对所有非类型模板参数进行持续评估。