簡體   English   中英

迭代器的統一初始化

[英]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.

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