問題

看一下這個簡單的例子:

 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不是?換句話說,為什麼const從返回型別const_create<int>中刪除?它的工作原理就像它返回int,而不是const int.這不是語言的不一致嗎?

標準在哪裡授權這種行為?

  最佳答案

[expr] / 6 說:

如果prvalue最初有型別“cv T”,其中T是一個 cv-recured non-class,非陣列型別, 在進一步分析之前,表示式調整為 T

因此,const Foo prvalue只是const Foo,但const int prvalue被調整為int.


這個規則在C 14中引入(比較 N3337 [basic.lval] / 4 N4140 [expr] / 6 ), CWG 1261 .

  相同標籤的其他問題

c++constvalue-categories