2016-11-19 66 views
2

Kona會議上,構造函數(P0091R0)的模板參數扣除已被批准。它簡化了一些變量定義:初始化列表中的構造函數的模板參數扣除

std::pair p {1,2};  // o.k., constructor pair<int,int>(1,2) 
std::vector v1 (10, 0); // o.k., 10 zeroes, constructor vector<int>(size_t n, T initvalue) 
std::vector v2 {10, 0}; // o.k., 2 values: 10, 0, apparently initializer list? 
std::vector v3 = {10, 0}; // o.k., same as v2? 

但是,下面的線不會以GCC 7編譯HEAD 201611版本(live example):

std::vector v4 = {3};  // error: no matching function for call to 'std::vector(int)' 
std::vector v5 {1, 2, 3}; // error: 'int' is not a class 
std::set s {1, 2, 3}; // error: no matching function for call to 'std::set(int,int,int)' 

這些僅僅是 「遙遠的橋」,因爲它們涉及初始化列表? 它們是否覆蓋了模板類型參數推導? 當編譯器符合C++ 1z時,它們會被允許嗎?

+0

我認爲你的「與v3相同?」是一個錯字。 –

+0

@John Zwinck:是的,謝謝,糾正。 –

+1

最初的建議根本沒有正確的措辭。我們有一些[大規模標準修復](https://github.com/cplusplus/draft/commit/954e86feae0c5cbb80c2c506fd5e3db4993bf60a)傳入。 –

回答

3

你需要一個額外的一對大括號的正確使你的代碼工作:

std::vector v4 = {{1, 5}}; 
std::vector v5 {{1, 2, 3}}; 
std::set s {{1, 2, 3}}; 
+0

爲什麼'std :: vector v2 {10,0};'然後呢? – ildjarn

+2

這與聚合初始化有什麼關係?沒有任何地方聚集。 –

+0

@ T.C。我認爲需要雙花括號來避免構建'std :: array'時出現的相同問題,但它對於矢量並不合適。雙花括號的真正原因是什麼? –

0

因爲你要撥打的foo::foo(const initializer_list &)構造函數,你需要告訴編譯器有exaclty一個說法,所以你需要一個額外的對括號或括號:

std::vector v5 ({1, 2, 3}); 
std::set s ({1, 2, 3}); 
      ^  ^

這樣,編譯器知道你調用一個函數只有一個參數作爲const initializer_list &,而不是FUNC三個int s。

相關問題