C++11 Visual Studio和gcc在编译可变模板程序时的不同行为

C++11 Visual Studio和gcc在编译可变模板程序时的不同行为,c++11,variadic-templates,C++11,Variadic Templates,我正在使用C++11的可变模板,下面是我的代码: #include "iostream" void func(){ std::cout << std::endl; } template< typename ...Params> void func(int x, Params... params){ std::cout << " int " << x; func(params...);

我正在使用C++11的可变模板,下面是我的代码:

#include "iostream"
void func(){
    std::cout << std::endl;
}

template< typename ...Params> void func(int x, Params... params){
    std::cout << " int " << x;
    func(params...);
}
template< typename ...Params> void func(float x, Params... params){
    std::cout << " float " << x;
    func(params...);
}
template< typename ...Params> void func(const char* x, Params... params){
    std::cout << " const char* " << x;
    func(params...);
}

int main(int argc, char* argv[])
{
    func(3.14f, 5, "Test");
    getchar();
    return 0;
}
#包括“iostream”
void func(){
std::cout void func(int x,Params…Params){

标准::coutgcc行为是正确的

大致上说,当你实例化一个模板时,实例化需要在找到原始模板定义的地方放置合法的C++代码(更确切地说,除了所谓的所有名字,在模板定义点上都需要解决)。 在您的例子中,第一个模板实例化为

void func(int x, const char *params0){
    std::cout << " int " << x;
    func(params0);
}
void func(int x,const char*params0){

请注意,此代码在MSVC 19.11.25506上编译时没有
/permissive-
标志。
void func(int x, const char *params0){
    std::cout << " int " << x;
    func(params0);
}