[英]Const in auto type deduction
我正在閱讀Scott Meyers的《有效的現代C ++》。 項目1包含以下示例:
template<typename T>
void f(T& param); // param is a reference
int x = 27; // x is an int
const int cx = x; // cx is a const int
f(cx); // T is const int,
// param's type is const int&
在第3項中出現以下示例:
Widget w;
const Widget& cw = w;
auto myWidget1 = cw; // auto type deduction:
// myWidget1's type is Widget
基於項目1,我希望myWidget1
的類型為const Widget
。 我想念什么嗎?
在大多數情況下, auto
遵循模板參數推導的規則:
§7.1.6.4 [dcl.spec.auto] / p6:
一旦聲明符-ID的類型已經根據8.3確定,使用說明符-ID的聲明的變量的類型是從它的初始值設定的使用用於模板參數推導規則的類型確定。 令
T
為為變量標識符d
確定的類型。 通過用新的發明類型模板參數U
替換auto
的出現,或者如果初始化程序是braced-init-list (8.5.4)替換為std::initializer_list<U>
,從T
獲取P
然后,使用從函數調用(14.8.2.1)進行模板參數推導的規則確定的變量A
推導出的類型d
。
§14.8.2.1 [temp.deduct.call] / p2:
如果
P
不是引用類型:
[...]
如果
A
是CV-限定的類型,頂層cv修飾符A
的類型被忽略類型推演 。
如果希望myWidget1
為const Widget&
類型,則應將其聲明為引用類型,例如:
auto& myWidget1 = cw;
// ^
auto myWidget1 = cw;
遵循Meyers書中模板參數類型推導的第三條規則,即按值傳遞。 當您按值傳遞時,cv限定詞和引用將被忽略,因為您將獲得該對象的新副本,因此您實際上並不在乎從其復制的舊對象是const還是引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.