我一直以为当我使用初始化列表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可以以某种方式忽略 …