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

时间:2013-08-29 04:18:03

标签: 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
y1 = y2;                       // error--y1 is const

但对于返回基本类型的const返回类型,decltype似乎抛出const

const int makeCI();            // factory

decltype(makeCI()) z;          // z is NOT const
z = 5;                         // okay

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

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

1 个答案:

答案 0 :(得分:16)

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

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

  

类prvalues可以具有cv限定类型;非类prvalue总是有cv不合格的类型。

术语“cv-qualification”是指常规和挥发性资格。 int不是类类型,因此右值表达式makeCI()的类型是int,并且它不是const限定的。

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