C++20中依赖参数类型的模板函数使用auto声明是否等效?
问题结论
你给出的两种模板函数写法在C++20标准中完全等效,Visual Studio 2019 16.11版本的报错属于编译器自身的实现缺陷,不是语法错误。
规则说明
- C++20引入的简写函数模板语法允许在函数参数列表中直接使用
auto声明参数,每一个参数位置的auto都会等价对应顶层模板参数列表中的一个虚拟类型参数。 - 函数参数列表的声明作用域中,先声明的参数名对后续参数可见,因此可以合法使用
decltype(前置auto参数)、sizeof(前置auto参数)这类表达式推导后续参数的类型,这属于标准明确允许的用法。 - 你给出的
g函数等价于传统写法:
template<typename T> void g(T x, std::optional<T> y, std::array<char,sizeof(T)> z);
和你给出的f函数除了函数名之外没有任何行为差异。
报错原因说明
Visual Studio 2019对C++20简写函数模板的支持存在多处实现缺陷,无法处理后续参数依赖前置auto参数的场景,该问题在Visual Studio 2022 17.0及更高版本中已经修复。目前GCC 10+、Clang 12+等主流编译器均支持该语法,不会抛出对应错误。
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

