非字符串字面值是prvalue吗?

3
我不确定是否有遗漏,但是,用户定义的字面量会调用用户定义的函数,该函数可以返回任何值,也是一种字面量。
标准规定字面量始终是prvalue,除非它是字符串字面量,但是
#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 字面量 是一种基本表达式。它的类型取决于其形式。字符串文字是左值;所有其他字面量都是 prvalues。

并且用户定义的字面量也是字面量

我错过了什么?


5
标准是由人类撰写的文件。你所说的它不能包含矛盾是什么意思?按标准的定义来说,它不应该包含矛盾,甚至是必须不包含,但它可能仍然存在矛盾,而这可能就是其中之一。 - Daniel H
3
我不确定,但我认为这里是你看不到它是prvalue的原因。 - NathanOliver
@NathanOliver 我已经阅读了那个,但它只是一个注释(非规范性的),并且它说受前面的项目限制(根据上下文,这使它成为一个字面量),因此 [expr.prim.literal]/1 仍然适用。 - ABu
2
这个注释可能不是规范性的,但它指向了[lex.ext]/2,而那是规范性的。 - StoryTeller - Unslander Monica
1
明显的标准措辞缺陷是显而易见的。这真的很重要吗?是的,在您的示例中,5_a是一个左值,并且可能所有编译器都正确地将其作为左值调用。是否存在真正的困惑源? - Barry
显示剩余7条评论
1个回答

4
是的,这是标准中一个微小的措辞缺陷。你可以在N1905中找到这句话(几乎)没有变化:

字面量是一种基本表达式。它的类型取决于它的形式(2.13)。字符串字面量是lvalue;所有其他字面量都是rvalue。

这个标准比用户定义的字面量早几年(N2765是从2008年中期开始的),而这个特定的措辞没有改变以反映“所有其他字面量都是[r]值”的部分不应包括用户定义的字面量。

然而,很明显由于用户定义字面值只是语法糖来实现函数调用,它的值类别也应该从函数调用中派生。这就是语言特性的重点。在您的示例中,5_a的值类别是lvalue而不是prvalue(所有编译器都同意),因此对于这个措辞的缺陷报告将得到相当低的优先级(如果有的话)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接