非字符串文字是纯右值?

Non-string literals are prvalues?

我不确定我是否遗漏了什么,但是,用户定义的文字,它调用可以 return 任何东西的用户定义的函数,也是一种文字。

标准说文字总是纯右值,除非它是字符串文字,but:

#include <iostream>
#include <typeinfo>

int& operator""_a(unsigned long long c);

int main()
{
    std::cout << std::is_same<decltype(5_a), int&>::value;
} 

在 GCC 和 Clang 中都打印 1,这证明文字 5_a(不是字符串文字)被视为左值而不是右值:

[expr.prim.literal]/1 A literal is a primary expression. Its type depends on its form. A string literal is an lvalue; all other literals are prvalues.

和用户定义的文字是literals too.

我缺少什么?

是的,这是标准中的一个小措辞缺陷。您可以在 N1905:

中找到那句话(几乎)一直没有变化

A literal is a primary expression. Its type depends on its form (2.13). A string literal is an lvalue; all other literals are rvalues.

该标准早于用户定义的文字数年(N2765 是从 2008 年年中开始的),并且这个特定的措辞没有改变以反映 "all other literals are [p]rvalues" 部分不应该包括用户定义的文字。

但是,很明显,由于用户定义文字只是 function call 的语法糖,其值类别也应该从函数调用派生。这就是语言功能的重点。毫无疑问,您示例中 5_a 的值类别是左值而不是纯右值(所有编译器都同意),因此此措辞的缺陷报告将获得非常低的优先级(如果有的话)。