可变参数模板类成员函数默认模板模板参数为自身是否合法?
模板模板参数默认值的编译器兼容性问题
以下代码可在clang++ 10.0中编译通过,但在g++ 12.2中无法编译,哪种编译器的行为符合C++标准?
template<typename... T> struct V{ template<template<typename...> class U=V, typename T2> static void foo(T2){} }; int main(){ V<int>::foo(0); }
更新说明
正如评论指出,最新版本的GCC已可编译此代码。同时存在一个适用于旧版GCC的简单解决方案:创建别名模板,代码如下:
template<typename... T> struct V{ template<typename ... TT> using vars = V<TT...>; template<template<typename...> class U=vars, typename T2> static void foo(T2){} }; int main(){ V<int>::foo(0); }
需要注意的是,此问题与其他类似问题不同——它是GCC 13.0版本之前存在的bug,仅在将类作为成员函数的模板模板参数默认值时触发,类名注入在其他场景下可正常工作,上述解决方案也能证明这一点。
内容的提问来源于stack exchange,提问作者Paolo Crosetto
相关产品推荐
相关产品推荐

