8

作为一般规则,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

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

const int makeCI();            // factory

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

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

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

谢谢。

4

1 回答 1

16

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

函数调用表达式是makeCI()纯右值表达式。根据 C++11 §3.10[basic.lval]/4:

类纯右值可以有 cv 限定类型;非类纯右值始终具有 cv 非限定类型。

术语“cv 限定”是指 const 和 volatile 限定。 int不是类类型,所以右值表达式的类型makeCI()int并且它不是 const 限定的。

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

于 2013-08-29T04:57:47.607 回答