統一初始化是一個重要且有用的C++ 11功能。但是,你不能只用{}
無處不在,因爲:爲什麼不是雙花括號語法首選構造函數採用std :: initializer_list
std::vector<int> a(10, 0); // 10 elements of value zero
std::vector<int> b({10, 0}); // 2 elements of value 10 and 0 respectively
std::vector<int> c{10, 0}; // 2 elements of value 10 and 0 respectively
std::vector<int> d = {10, 0}; // 2 elements of value 10 and 0 respectively
auto e(0); // deduced type is int
auto f = 0; // deduced type is int
auto g{0}; // deduced type is std::initializer_list<int>
auto h = {0}; // deduced type is std::initializer_list<int>
注意到在例如集合初始化std::arrays
需要使用{{}}
,在我看來,與整個問題,其矢量構造函數將選擇通過要求{{}}
本來是可以避免調用構造函數採取std::initializer_list
:
std::vector<int> i{10, 0}; // 10 elements of value zero
std::vector<int> j{{10, 0}}; // 2 elements of value 10 and 0 respectively
std::vector<int> k = {10, 0}; // 2 elements of value 10 and 0 respectively
auto l{0}; // deduced type is int
auto m{{0}}; // deduced type is std::initializer_list<int>
auto n = {0}; // deduced type is std::initializer_list<int>
我敢肯定這是討論過的,所以反對這個的原因是什麼?來自標準提案的報價/鏈接是首選答案。
更新。 - 有在N2532點,指出:
(3)只發生短初始化列表的可能討厭不確定性的情況下[...]
(5)爲什麼要語言規則力的程序員誰想要簡潔 和模糊控制(完美的理由)寫更多 請程序員誰更喜歡(爲了完美的原因)更多 顯式 - 可以嗎?
[...]
假設一個程序員期望F(X)被調用。 f(Y) 如何「劫持」呼叫? (4)假設X沒有初始化列表構造函數,但是Y沒有。在 這種情況下,給予初始化列表構造函數的優先級青睞劫持程序(記住我們假定程序員以某種方式預計f(X)被調用)。這類似於某人希望使用用戶定義的轉換調用f(X),並且有人來到 以及完全匹配的f(Y)。 我認爲這將是公平的 期望有人誰使用{...}將記住 初始化器列表構造函數的可能性。 [重點煤礦]
我想關鍵在於可以,這意味着你不必使用統一的初始化。使用{}
正確是困難的,因爲:
你不僅要檢查你想打電話,但也爲任何構造服用
initializer_list
可能贏得(可能會)在它的構造函數;如果在未來使用
{}
有人編寫代碼將一個std::initializer_list
構造你的代碼可能會破壞和這樣做默默。
即使你有一類A
與構造A(int, bool)
和A(std::initializer_list<double>)
,後者將在前者被選擇爲A a{0, false};
(其中IMO是堅果),所以我覺得它真的很難用統一的初始化在具有或可能有(需要水晶球超級大國)initializer_list
構造函數。
事實上,你的代碼可以默默地打破我很多擔心。
我不確定你試圖解決哪個「問題」。你只是展示了一種不同的做事方式。我看到的唯一「問題」是'std :: array',可能需要兩組大括號。但我認爲這是正在解決的問題。 – juanchopanza
我試圖解決的問題是找出爲什麼這種不同的做事方式不是標準化的(目前的做法)。特別是,我可能需要這個決定背後的原因或反對它的好例子才能得到滿足。 – gnzlbg
我不認爲有人會想'auto e {0,0};'是一個錯誤。我也不認爲有人會希望它被視爲逗號運算符的應用程序。唯一明智的類型是'std :: initializer_list'(或類似'int []'的東西)。但是,如果'auto e {(int列表)};'被解析爲'std :: initializer_list ',並且'auto e {0};'的格式爲'auto e {(list of int)} ;',那麼它會導致特殊的不必要的複雜性,以便根據列表的長度添加特定的例外。 –
hvd