C++ 为什么decltype从内置类型的返回类型中删除const?
一般来说,C++ 为什么decltype从内置类型的返回类型中删除const?,c++,c++11,decltype,C++,C++11,Decltype,一般来说,decltype保留常量: const int ci = 0; decltype(ci) x; // x is const int x = 5; // error--x is const class Gadget{}: const Gadget makeCG(); // factory decltype(makeCG()) y1, y2; // y1 and y2 are const Gadgets y
decltype
保留常量:
const int ci = 0;
decltype(ci) x; // x is const int
x = 5; // error--x is const
class Gadget{}:
const Gadget makeCG(); // factory
decltype(makeCG()) y1, y2; // y1 and y2 are const Gadgets
y1 = y2; // error--y1 is const
但是对于返回基本类型的const
返回类型,decltype
似乎会丢弃const
:
const int makeCI(); // factory
decltype(makeCI()) z; // z is NOT const
z = 5; // okay
在这种情况下,decltype
为什么要放弃常量?我指的是两个方面的问题:
谢谢。您观察到的行为是正确的:
decltype(makeCI())
是int
,而不是int const
makeCI()
函数调用表达式是一个prvalue表达式。根据C++11第3.10节[basic.lval]/4:
类prvalues可以具有cv限定类型;非类PRValue始终具有cv不合格类型
术语“cv鉴定”指常量和挥发性鉴定int
不是类类型,因此右值表达式makeCI()
的类型是int
,并且它不是const限定的
(在最近的C++语言标准草案中,例如N3690,该文本已被删除,并被新的文本在第5条[ExpR] 6中替换,它表示,如果PR值最初具有类型“CV T”,其中T是CV不合格的非类非数组类型,则在进一步分析之前将表达式的类型调整为T。
你到底为什么要按常量值返回?@BillyONeal:这是个好问题,但这并不能使这个问题无效。@Nicolas:我从来没有说过它是这样做的。@BillyONeal:我的兴趣是理解decltype,因为它对用户定义类型和基本类型按值返回的处理方式不同,我只是想知道为什么。我想我真的需要多加注意+1.感谢您提供指向解决此问题的标准部分的指针。我不知道这个规则的历史。此规则在C++98中存在。在大多数情况下,这并不重要。(例如,大多数内置操作在发生修改时需要可修改的左值,因此右值表达式的常量限定并不重要。)