带默认值的模板别名推导:MSVC编译报错是否为Bug?
带默认值的模板别名推导在MSVC中的编译错误分析
这是MSVC的未完全实现P1814R0提案导致的问题,并非你遗漏了相关配置。
P1814R0提案的核心规则是:带默认模板参数的别名模板支持自动推导——当使用别名模板却不显式指定参数时,编译器应当自动套用其默认参数完成推导。比如你代码里的Matrix3 a;,按提案要求应该等价于Matrix3<double> a;,最终实例化Matrix<double,3,3>。
目前各编译器的支持情况:
- GCC 12.2开启
-std=c++20后已经正确实现了该特性,所以你的测试代码能正常编译。 - MSVC v19.33虽然标称支持P1814R0,但实际上在这种「无显式模板参数的别名模板推导」场景下存在实现缺失,才会抛出
C2641: cannot deduce template arguments for 'Matrix3'的错误。
测试代码:
template <typename Type, int Row, int Col, int Options = 0> class Matrix { Type storage[Row * Col]; }; template <typename Type = double> using Matrix3 = Matrix<Type, 3, 3>; int main() { Matrix3 a; return 0; }
内容的提问来源于stack exchange,提问作者Yingnan Wu
相关产品推荐
相关产品推荐

