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。这不是语言上的矛盾吗?
标准在哪里规定这种行为?
如果prvalue最初具有类型“ cv
T”,其中Tcv是不合格的非类,非数组类型,则T在进行任何进一步分析之前,将表达式的类型调整为。
因此,const Fooprvalue是just const Foo,但是const intprvalue调整为int。
由CWG 1261在C ++ 14(将N3337 [basic.lval] / 4与N4140 [expr] / 6比较)中引入了此规则。