簡體   English   中英

自動類型推導中的常量

[英]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的類型被忽略類型推演

如果希望myWidget1const Widget&類型,則應將其聲明為引用類型,例如:

auto& myWidget1 = cw;
//  ^

演示

auto myWidget1 = cw; 遵循Meyers書中模板參數類型推導的第三條規則,即按值傳遞。 當您按值傳遞時,cv限定詞和引用將被忽略,因為您將獲得該對象的新副本,因此您實際上並不在乎從其復制的舊對象是const還是引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM