C++ 非字符串文字是prvalues吗?

C++ 非字符串文字是prvalues吗?,c++,c++14,c++17,lvalue,user-defined-literals,C++,C++14,C++17,Lvalue,User Defined Literals,我不确定我是否遗漏了什么,但是,用户定义的文本(调用可以返回任何内容的用户定义函数)也是一种文本 标准规定,除非是字符串文字,否则文字总是prvalue: #包括 #包括 整型运算符“”\u a(无符号长c); int main() { std::cout是的,这是标准中的一个小的措词缺陷。你可以发现,在: 文字是主表达式。其类型取决于其形式(2.13)。字符串文字是左值;所有其他文字都是右值 这个标准比用户定义的文字早了几年(从2008年中期开始),并且这个特殊的措辞没有改变,以反映“所有其他

我不确定我是否遗漏了什么,但是,用户定义的文本(调用可以返回任何内容的用户定义函数)也是一种文本

标准规定,除非是字符串文字,否则文字总是prvalue:

#包括
#包括
整型运算符“”\u a(无符号长c);
int main()
{

std::cout是的,这是标准中的一个小的措词缺陷。你可以发现,在:

文字是主表达式。其类型取决于其形式(2.13)。字符串文字是左值;所有其他文字都是右值

这个标准比用户定义的文字早了几年(从2008年中期开始),并且这个特殊的措辞没有改变,以反映“所有其他文字都是[p]右值”部分不应该包括用户定义的文字


然而,很明显,由于用户定义的文字只是a的语法糖,它的值类别也应该从函数调用中派生出来。这就是语言特性的要点。在您的示例中,
5_a
的值类别是左值而不是PR值(所有编译器都同意),因此,如果有这种措辞的缺陷报告,其优先级将非常低。

根据左值,包括“函数调用或重载运算符表达式,其返回类型为左值引用”。用户定义的文本实际上是重载运算符(在您的示例中,
5_a
等于呼叫
操作员“”\u a(5)
)。并且您的运算符函数返回一个左值引用,您可以将其与同一类型的左值引用进行比较。@Peregring lk A standard是由人类编写的文档。它不能包含矛盾是什么意思?它不应该包含矛盾,使用标准定义它不能包含矛盾,但它可能无论如何都包含矛盾,这可能是其中之一。不这是一个答案,因为我不是100%确定,但我认为这就是为什么您没有看到它是一个prvalue。注释可能不规范。但它导致[lex.ext]/。这是规范性的。明显的标准措辞缺陷。这真的很重要吗?是的,
5_a
在您的示例中是一个左值,可能所有编译器都正确地调用了它。这真的是一个混乱的根源吗?
#include <iostream>
#include <typeinfo>

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

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