MSVC拒绝编译模板类中带auto参数的成员函数是否为bug
问题结论
这一编译差异属于MSVC的已知Bug,符合C++20标准的编译器应当正常编译你给出的代码。
原因说明
- 你代码中
operator/=参数里使用auto的写法,是C++20正式引入的**简写函数模板(Abbreviated Function Template)**特性 - 按照标准规定,当非模板函数的参数列表出现
auto时,语义等价于手动为每个auto参数声明一个对应的模板参数,你给出的代码和修改后的显式模板参数版本逻辑完全等效 - MSVC对该特性的支持存在缺陷,它错误地拒绝了类模板内部的普通成员函数使用
auto声明简写函数模板,只有显式写出模板参数列表时才能正常解析,不符合C++标准要求
问题复现代码
#include <vector> #include <iostream> template<typename T> struct A { A& operator/=(const auto&x) { return *this; } }; int main() { A<int> a; a /= 10; }
兼容方案
如果需要适配旧版本MSVC,直接使用手动显式声明模板参数template<typename U>的写法即可,该写法在所有支持C++20的编译器中表现一致。
内容的提问来源于stack exchange,提问作者rafoo
相关产品推荐
相关产品推荐

