2015-12-10 63 views
3

std::pair沒有構造函數以初始化列表作爲參數,但下面的代碼如何編譯?foo({1,2})如何爲「void foo(對<int,int>)」工作

void foo(std::pair<int,int> pr) 
{ 
} 

void foo2(std::tuple<int,int,int> t) 
{ 
} 

void bar() 
{ 
    foo({1,2});        // compile OK 
    foo(std::pair<int,int>{1,2});    // compile OK 
    foo2(std::tuple<int,int,int>{1,2,3});  // compile OK 
    foo2({1,2,3});  // compile error 
} 

我使用clang3.7.0

回答

2

統一初始化是不是初始化列表。 Braced-init-list(用於初始化對象的{}的技術術語)可以調用的任何構造函數(儘管它可以僅限於非顯式構造函數,具體取決於您如何使用它)。它傾向於構造函數initializer_list,但它會調用任何與其參數列表相匹配的構造函數。

因此,它調用pair構造函數,該構造函數接受適當類型的兩個參數。

foo2是我之前提到的原因的編譯錯誤。帶有兩個值的pair的構造函數不是顯式的,但tuple的等價構造函數是顯式的。因此,你需要明確地使用類型的名字來調用構造函數:

foo2(std::tuple<int, int, int>{1,2,3}); 

注意,在C++ 17,這tuple構造函數將被製成無明確的,如果在類型列表中的類型可以是非明確地從給定類型轉換。所以你的原始聲明應該在C++ 17實現下工作。 「

+0

」統一初始化與初始化程序列表無關。「我總是混淆{},非常感謝您的澄清! – camino

相關問題