Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 即使重载函数的参数计数不匹配,编译器是否应该实例化所有依赖于参数的类型_C++_Templates_Language Lawyer - Fatal编程技术网

C++ 即使重载函数的参数计数不匹配,编译器是否应该实例化所有依赖于参数的类型

C++ 即使重载函数的参数计数不匹配,编译器是否应该实例化所有依赖于参数的类型,c++,templates,language-lawyer,C++,Templates,Language Lawyer,考虑一个简单的例子: #include <type_traits> template <class T, std::size_t N> struct MaybeAssert { using type = T; static_assert(N < 1, "Assertion"); }; template <class T> void foo(typename MaybeAssert<T, 0>::type) { } tem

考虑一个简单的例子:

#include <type_traits>

template <class T, std::size_t N>
struct MaybeAssert {
    using type = T;
    static_assert(N < 1, "Assertion");
};

template <class T>
void foo(typename MaybeAssert<T, 0>::type) {
}

template <class T>
void foo(typename MaybeAssert<T, 0>::type, 
         typename MaybeAssert<T, 1>::type) {
}

int main() {
   foo<int>(2);
}
#包括
模板
结构MaybeAssert{
使用类型=T;
静态断言(N<1,“断言”);
};
模板
void foo(类型名MaybeAssert::type){
}
模板
void foo(类型名MaybeAssert::type,
类型名称可能是(类型){
}
int main(){
富(2),;
}
实例化
MaybeAssert
,该示例中触发
static\u assert

另一方面,仅当函数模板参数的数量匹配时才实例化类型。哪个编译器是正确的?

两者都是有效的:

如果重载解析过程可以在不实例化类模板定义的情况下确定要调用的正确函数,则未指定该实例化是否实际发生


FWIW MSVS 2017的表现和clang一样。另一方面,我认为icc的表现就像gccdidn一样,我不知道编译器可以在那里选择!谢谢