为什么在某些情况下从函数返回类型中删除 cv 限定符?

Why do cv-qualifiers get removed from function return type in some cases?

本文关键字:cv 删除 返回类型 情况下 函数 为什么      更新时间:2023-10-16

看看这个简单的例子:

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
}

为什么带有Foo的版本可以编译,而带有int的版本不能编译?换句话说,为什么constconst_create<int>的返回类型中删除?它的工作原理就像它返回int,而不是const int。这不是语言上的不一致吗?

标准在哪里强制要求这种行为?

[expr]/6 说:

如果 prvalue 最初具有 ">cvT"类型,其中T是 CV-不合格非类、非数组类型、类型在进行任何进一步分析之前,将表达调整为T

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


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