为什么在某些情况下,cv-qualifiers从函数返回类型中删除?

gez*_*eza 6 c++ const value-categories

看这个简单的例子:

template <typename T>
const T const_create() {
    return T();
}

struct Foo { };

int main() {
    auto &x = const_create<Foo>(); // compiles
    // auto &x = const_create<int>(); // doesn't compile
}
Run Code Online (Sandbox Code Playgroud)

为什么版本可以Foo编译,而int不能编译?换句话说,为什么const要从返回类型中删除const_create<int>?它的工作方式就像它返回一样int,不是const int。这不是语言上的矛盾吗?

标准在哪里规定这种行为?

L. *_* F. 8

[expr] / 6说:

如果prvalue最初具有类型“ cv T ”,其中Tcv是不合格的非类,非数组类型,则T在进行任何进一步分析之前,将表达式的类型调整为。

因此,const Fooprvalue是just const Foo,但是const intprvalue调整为int


CWG 1261在C ++ 14(将N3337 [basic.lval] / 4N4140 [expr] / 6比较)中引入了此规则。

  • 我对此规则的原因很好奇。 (2认同)