为什么decltype从内置类型的返回类型中删除const?

Kno*_*abe 8 c++ decltype c++11

作为一般规则,decltype保留constness:

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
Run Code Online (Sandbox Code Playgroud)

但对于const返回基本类型的返回类型,decltype似乎扔掉const了:

const int makeCI();            // factory

decltype(makeCI()) z;          // z is NOT const
z = 5;                         // okay
Run Code Online (Sandbox Code Playgroud)

为什么decltype在这种情况下丢弃常量?我的意思是两个方面的问题:

  1. 标准的哪一部分指定了这种行为?
  2. 以这种方式指定行为的动机是什么?

谢谢.

Jam*_*lis 16

你观察到的行为是正确的: decltype(makeCI())int,不是int const.

makeCI()函数调用表达式是一个prvalue表达.Per C++11§3.10[basic.lval]/4:

类prvalues可以具有cv限定类型; 非类prvalues始终具有cv不合格类型.

术语"cv-qualification"是指const-and volatile-qualification. int不是类类型,因此rvalue表达式的类型makeCI()是,int并且它不是const限定的.

(在最近的C++语言标准草案中,例如N3690,该文本已被删除,并被§5[expr]/6中的新文本取代,其中指出,"如果prvalue最初具有"cv T"类型,则其中T是一个cv不合格的非类非数组类型,在进行任何进一步分析之前,表达式的类型调整为T."有关详细信息,请参阅CWG缺陷1261.)