我不确定我是否遗漏了某些内容,但是,用户定义的文字会调用可以返回任何内容的用户定义函数,也是一种文字。
标准说文字总是一个prvalue,除非它是一个字符串文字,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 literal 是主要表达式。它的类型取决于它的形式。字符串文字是左值;所有其他文字都是prvalues。
和用户定义的文字 literals too 。
我错过了什么?
答案 0 :(得分:4)
是的,这是标准中的一个轻微的措辞缺陷。您可以在N1905中找到该句子(几乎)不变:
literal 是主要表达式。它的类型取决于它的形式(2.13)。字符串文字是左值;所有其他文字都是右值。
此标准比用户定义的文字早几年(N2765是从2008年中开始),并且这个特定的措辞没有改变以反映所有其他文字是[ p]右值&#34;部分不应包含用户定义的文字。
但是,很明显,因为用户定义的文字只是function call的语法糖,所以它的值类别也应该从函数调用中派生出来。这是语言功能的重点。在您的示例中,5_a
的值类别是左值而不是prvalue(所有编译器都同意)并不存在混淆,因此这种措辞的缺陷报告优先级非常低,如果有的话。