[英]Uniform initialization of iterators
我是C ++ 11的新手,迭代器和統一初始化存在問題,我不明白。
請考慮以下示例,該示例無法編譯:
#include <iostream>
#include <vector>
int main() {
std::vector<int> t{1, 2, 3, 4, 5};
auto iter{t.begin()};
for (; iter != t.end(); ++iter) {
std::cout << *iter;
}
return 0;
}
在第6行中,使用統一初始化初始化向量。 在第7行中,我嘗試使用迭代器執行相同的操作。 這是行不通的。 將第7行更改為auto iter = t.begin()
。 我知道我可以簡單地使用“基於范圍”,但問題是:為什么統一初始化不適用於迭代器,但對於基本類型(如int i{0};
?
當您使用初始化列表作為auto
的初始化程序時,聲明的變量將被推導為初始化列表。 換句話說, iter
被聲明為std::initializer_list<vector<int>::iterator>
,而不是你vector<int>::iterator
。
將其更改為auto iter = t.begin()
是繼續進行的最佳方式。
C ++ 11有一個特殊的auto
和支撐初始化規則,它被推斷為std::initializer_list
。 在您的情況下,您的選擇是以下之一:
auto iter(t.begin());
auto iter = t.begin();
行為描述於:
§7.1.6.4/ 7
auto
說明符[dcl.spec.auto]令T為函數的變量或返回類型的聲明類型 。 如果占位符是自動類型說明符,則使用模板參數推導的規則確定推導的類型。 如果扣除是針對return語句而初始化器是braced-init-list(8.5.4),則程序格式錯誤。 否則,通過用新發明的類型模板參數U 替換auto的出現來獲得P,或者如果初始化器是braced-init-list,則用std :: initializer_- list替換 。 使用函數調用(14.8.2.1)中的模板參數推導規則來推導U的值,其中P是函數模板參數類型,初始化器是相應的參數。 如果扣除失敗,則聲明格式不正確。 否則,通過將推導的U代入P來獲得為變量或返回類型推導出的類型。
(強調我的)。
Scott Meyer最近提出了一個關於這個問題的討論。 我建議觀看視頻。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.