2012-01-18 26 views
10

最終的C++ 11標準包含基於範圍的規定,以便爲本地陣列「正常工作」,而不必包含<iterator>或任何其他頭文件。據我所知,這首先是在工作文件n2900中作爲評論UK 78和79的結果。#include <initializer_list>需要使用基於範圍的初始化器列表嗎?

該提案還包括在每個翻譯單元中隱含#include <initializer_list>的規定,以便例如程序

#include <iostream> 

int main() 
{ 
    for (auto i : { 1, 2, 3, 4, 5 }) 
     std::cout << i << "\n"; 
} 

即使不包括<initializer_list>也是符合標準的。

但是,當概念從C++ 11中刪除時,基於範圍的for被修改,如n2930所示。雖然提供數組「僅僅工作」仍然存在,但沒有提及初始化程序列表同樣如此;事實上,各種標準庫容器標題將爲#include <initializer_list>和8.5.4.2的最終文本的規範意味着與我相反。

據我所知,這非常接近關於該主題的最後措詞。那麼,以上的程序是否與最終的標準相符?還是我需要#include <initializer_list>甚至可以在基於範圍的情況下使用它?換句話說,是否使用基於範圍的初始化程序列表構成「使用std::initializer_list ---即使是FDIS的每8.5.4.2中未指定類型的隱式使用」?

+2

很確定這是「是」。如果不是初始化器列表,你的循環還會迭代什麼? – 2012-01-18 16:39:33

回答

6

我會說是的。根據§6.5.4[stmt.ranged]/1,該語句

for (auto i : { 1, 2, 3, 4, 5 }) 
    ... 

只是相當於

auto&& __range = { 1, 2, 3, 4, 5 }; 
... 

,這意味着一個initializer_list<int>被使用,並且所述報頭<initializer_list>需要包括。

+0

這是我的懷疑,但它似乎有點不直觀。有點讓我想起C++ 03每本教科書如何使用'std :: endl',但只包含''而不是'iomanip'。 – 2012-01-19 14:29:12

相關問題