2016-04-07 69 views
14

下面的代碼編譯和運行:爲什麼`initializer_list <pair>`和`initializer_list <tuple>`的行爲有所不同?

#include <initializer_list> 
#include <iostream> 
#include <vector> 
#include <tuple> 

void ext(std::initializer_list<std::pair<double, std::vector<double> >> myList) 
{ 
    //Do something 
} 

/////////////////////////////////////////////////////////// 

int main(void) { 
    ext({ {1.0, {2.0, 3.0, 4.0} } }); 
    return 0; 
} 

雖然這一個不:

#include <initializer_list> 
#include <iostream> 
#include <vector> 
#include <tuple> 

void ext(std::initializer_list<std::tuple<double, std::vector<double> >> myList) 
{ 
    //Do something 
} 

/////////////////////////////////////////////////////////// 

int main(void) { 
    ext({ {1.0, {2.0, 3.0, 4.0} } }); 
    return 0; 
} 

唯一差別在於,在第一種情況下ext()函數採用類型initializer_list<pair>(作品)的參數而另一個使用initializer_list<tuple>(不起作用)。但是,cplusplus.com states that

對是元組的特殊情況。

那麼爲什麼一個代碼工作,其他不是?


附加信息

通過鐺在第二種情況下輸出++的錯誤是:

main.cpp:33:2: error: no matching function for call to 'ext' 
     ext({ {1.0, {2.0, 3.0, 4.0} } }); 
     ^~~ 
main.cpp:7:6: note: candidate function not viable: cannot convert initializer list argument to 'std::tuple<double, 
     std::vector<double, std::allocator<double> > >' 
void ext(std::initializer_list<std::tuple<double, std::vector<double> >> myList) 
    ^
1 error generated. 

而克++輸出:

main.cpp: In function ‘int main()’: 
main.cpp:33:35: error: converting to ‘std::tuple<double, std::vector<double, std::allocator<double> > >’ from initializer list would use explicit constructor ‘constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with _T1 = double; _T2 = std::vector<double>]’ 
    ext({ {1.0, {2.0, 3.0, 4.0} } }); 
           ^

回答

14

cplusplus.com是不是一個很好的因爲它充滿了虛假陳述,比如「對是一個特殊的元組情況」。您可以改用cppreference。事實上,pair不是元組的特例。

現在認爲tuple是更好的設計; pair比較老舊,因爲向後兼容性而無法更改。

錯誤消息表明不同的是tuple有一個explicit構造函數,但pair沒有。

這意味着你需要提及的類名構造一個元組時:

ext({ std::tuple<double,std::vector<double>>{1.0, {2.0, 3.0, 4.0} } }); 

這將在改變C++ 17:tuple構造將是明確的,當且僅當一個元組的類型是具有顯式構造函數的類類型。 gcc 6已經實現了這個功能。 (信貸 - 喬納森Wakely)。見N4387

+4

N.B.現在元組的構造函數的'explicit''s現在是以參數類型爲條件的,並且示例代碼將在C++ 17中有效(現在使用GCC 6進行編譯)。 –

+0

@JonathanWakely謝謝你的信息。我只是想知道如果OP詢問「爲什麼它是明確的,這看起來很煩人」,我會怎麼回答,我沒有任何好的答案 –

+0

@ M.M感謝您的幫助!確實,這將是一個很好的問題...... –

相關問題