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中存在。在大多数情况下,这并不重要。(例如,大多数内置操作在发生修改时需要可修改的左值,因此右值表达式的常量限定并不重要。)