非字符串文字是prvalues?

时间:2017-10-02 14:39:02

标签: c++ c++14 c++17 lvalue user-defined-literals

我不确定我是否遗漏了某些内容,但是,用户定义的文字会调用可以返回任何内容的用户定义函数,也是一种文字。

标准说文字总是一个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

我错过了什么?

1 个答案:

答案 0 :(得分:4)

是的,这是标准中的一个轻微的措辞缺陷。您可以在N1905中找到该句子(几乎)不变:

  

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

此标准比用户定义的文字早几年(N2765是从2008年中开始),并且这个特定的措辞没有改变以反映所有其他文字是[ p]右值&#34;部分不应包含用户定义的文字。

但是,很明显,因为用户定义的文字只是function call的语法糖,所以它的值类别也应该从函数调用中派生出来。这是语言功能的重点。在您的示例中,5_a的值类别是左值而不是prvalue(所有编译器都同意)并不存在混淆,因此这种措辞的缺陷报告优先级非常低,如果有的话。