带auto非类型模板参数的函数模板重载解析规则与编译器行为疑问
关于非类型模板参数含占位类型时重载函数模板选择规则的困惑
我最近在研究非类型模板参数包含占位类型(比如auto)时的函数模板重载选择规则,结果不同编译器的行为让我彻底困惑了,先看我写的测试代码:
template<int N> struct A{}; template<auto... N> void f(A<N...>); template<int N> void f(A<N>) {} template<auto N> void g(A<N>); template<int N> void g(A<N>) {} int main() { f( A<1>{} ); // GCC和Clang编译通过,MSVC报错 g( A<1>{} ); // GCC编译通过,Clang和MSVC报错 }
针对这段代码,不同编译器的处理结果差异很大:
- 调用
f(A<1>{})时:GCC和Clang都能成功编译,而MSVC会报错说无法在两个重载模板中做出选择 - 调用
g(A<1>{})时:只有GCC能编译通过,Clang和MSVC都会报重载歧义的错误
我的核心疑问是:到底哪种编译器的行为是符合C++标准的?还是说标准对此并没有明确规定?
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

