C 11中的auto陷阱

2021-06-07 02:42:43 字數 571 閱讀 9456

c++11中引入的auto關鍵字自動推導型別特性,可能是最方便也最容易理解的特性了。然而,即使是這個簡單特性,也有陷阱,需要我們使用時注意。

1、引用型別被推導為非引用型別

例如:

foo(void* arg) 

}

上面的**中big會被推導為mybigclass型別,而不是mybigclass&型別,從而導致拷貝構造發生。解決辦法是使用auto&,即:
auto& big = *static_cast(arg);
2、常量迭代器的推導

例如:

map m;

for (auto i = m.begin(); i != m.end(); ++i)

注意, m.begin() 返回型別是 iterator, 而不是 const_iterator, 因為這裡的 m 並不是 const。c++11 中的 cbegin() 能夠解決這個問題, 它返回 non-const 容器的 const 迭代器。

const auto& s = sys.setting();

c 11新特性之auto

在早期版本中,auto關鍵字用來宣告具有自動儲存器的區域性變數,auto關鍵字很少被使用,除了靜態變數之外,其它的變數預設是auto的。因此,在c 11中,刪除了原有的功能,並對其重新設計,增加了auto的型別推導功能。template double add t1 a,t2 b int main i...

C 11語法auto推導返回

c 不允許直接推導auto返回型別,如果要用auto返回型別,需要用decltype 宣告尾返回型別 如下面 template auto add a x,b y decltype x y 呼叫方式還是和普通的模板元函式一樣 std cout add 5,8 std endl std cout add...

C 11新特性之一 auto

c 是一門偉大的語言,永遠給程式設計師最大的設計自由,未使用的特性從不產生 新版本永遠完全相容舊版本。c 11先前被稱作c 0x,即iso iec 14882 2011,是c 程式語言的乙個標準。c 98 auto 早在c 98標準中就存在了auto關鍵字,那時的auto用於宣告變數為自動變數,自動...