2013-11-28 39 views
2

逗號(,)是否是序列號std::initializer_liststd :: initializer_list和元素的求值順序


例如:是本UB與否:

#include <vector> 

int main() 
{ 
    auto nums = [] 
    { 
     static unsigned x = 2; 
     return (x++ % 2) + 1; 
    }; 

    std::vector<int> v{ nums(), nums(), nums(), nums(), nums() }; 
    // not sure if this is different: (note the additional brackets) 
    // std::vector<int> v({ nums(), nums(), nums(), nums(), nums() }); 
    for(auto i : v) 
    { 
     std::cout << i; 
    } 

    return 0; 
} 
+2

C++ 11中不再有「序列點」。然而,評估的順序是有保證的,而且確實是有序的,但我會在回答之前先搜索一個重複的。 – dyp

+0

@DyP - 謝謝。我沒有發現重複,雖然我很確定我看到過類似的問題。我幾乎可以肯定,訂單是有保證的,但不是100%。 –

+1

[dcl.init.list]/4「也就是說,每個值計算和與給定的*初始化子句*相關的副作用在每個值計算之前被排序,並且與任何*初始化子句*它在* initializer-list *的逗號分隔列表中。「 – dyp

回答

4

根據C++ 11§8.5.4 [dcl.init.list]段落4:

4內初始化列表的初始化程序列表 初始化程序子句(包括從包擴展 (14.5.3)導致的任何結果)都按它們出現的順序進行評估。也就是 每個值計算和與給定的 初始化子句關聯的副作用在每個值計算之前被排序,並且 副作用與在初始化程序列表的逗號分隔列表 之後的任何初始化子句相關聯。

據我所知,GCC 4.8.1有一個相對於初始值設定項的評估的錯誤。我在這裏

http://cpp.forum24.ru/?1-3-0-00000063-000-0-0-1378892425

描述它雖然文字是寫在Russion但它可以通過使用例如谷歌翻譯簡單地翻譯成英語。