克服 C 20 中类模板构造函数中的冗余模板参数
在 C 20 中,类模板构造函数的声明经历了微妙但有影响力的改变。以前,类模板的构造函数可以选择在其声明符中包含模板参数列表,如以下代码片段所示:
template<typename T> struct S { S<T>(); };
但是,这种做法现在在 C 20 中已弃用。上面的代码将现在会在 -std=c 20 的 gcc trunk 中导致编译器错误。但是,它仍然会在 clang trunk 中使用相同的编译器进行编译标准。
更改的理由
删除类模板构造函数中的冗余模板参数解决了潜在的错误源。通过要求显式使用注入的类名,在类模板中声明构造函数时可以保留简单的意图。
对现有代码的影响
此更改可能会对依赖先前有效语法的现有代码库的影响。像上例这样的有效 C 2017 代码可能不再在 C 20 标准下编译。
受影响代码的解决方案
为了适应此更改,可以使用以下替代语法使用:
template<typename T> struct S { S(); // Constructor declaration using the injected class name };
或者,如果需要特定的模板参数,可以使用构造函数重载使用:
template<typename T> struct S { S<T>(); // Constructor declaration with explicit template arguments S<int>(); // Overload for specific template argument };
通过遵守这些语法指南,代码库可以保持与更新的 C 20 标准的兼容性。
以上是如何在 C 20 中正确声明类模板构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!