下面的代碼編譯和運行:爲什麼`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} } });
^
N.B.現在元組的構造函數的'explicit''s現在是以參數類型爲條件的,並且示例代碼將在C++ 17中有效(現在使用GCC 6進行編譯)。 –
@JonathanWakely謝謝你的信息。我只是想知道如果OP詢問「爲什麼它是明確的,這看起來很煩人」,我會怎麼回答,我沒有任何好的答案 –
@ M.M感謝您的幫助!確實,這將是一個很好的問題...... –