请考虑以下示例代码:
例:
void print(int n) {
cout << "element print\n";
}
void print(vector<int> vec) {
cout << "vector print\n";
}
int main() {
/* call 1 */ print(2);
/* call 2 */ print({2});
std::vector<int> v = {2};
/* call 3 */ print(v);
/* call 4 */ print( std::vector<int>{2} );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它生成以下输出:
element print
element print
vector print
vector print
Run Code Online (Sandbox Code Playgroud)
为什么print函数调用(上例中的调用2)与接受单个值的函数匹配?我在这个调用中创建了一个向量(包含单个元素),所以它与print使用向量作为输入的调用不匹配吗?
我一直以为当我使用初始化列表C++语法时:
something({ ... });
Run Code Online (Sandbox Code Playgroud)
编译器总是清楚我想要调用过载std::initializer_list,但对于MSVC 2015来说似乎并不那么清楚.
我测试了这个简单的代码:
#include <cstdio>
#include <initializer_list>
namespace testing {
template<typename T>
struct Test {
Test() {
printf("Test::Test()\n");
}
explicit Test(size_t count) {
printf("Test::Test(int)\n");
}
Test(std::initializer_list<T> init) {
printf("Test::Test(std::initializer_list)\n");
}
T* member;
};
struct IntSimilar {
int val;
IntSimilar() : val(0) {}
IntSimilar(int v) : val(v) {}
operator int() {
return val;
}
};
}
int main() {
testing::Test<testing::IntSimilar> obj({ 10 });
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并且在GCC 6.3中它按预期工作,呼叫 Test::Test(std::initializer_list)
但在MSVC 2015中,此代码调用Test::Test(int).
似乎MSVC可以以某种方式忽略 …