作为一般规则,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
在这种情况下会丢弃常量?我的意思是两个方面的问题:
感谢。
答案 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。)