C++11的默认模板参数如何支持长尾函数模板?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1119个文字,预计阅读时间需要5分钟。
在C++98/03标准中,模板参数默认值仅适用于非类型模板参数,例如模板形参的默认值。对于函数模板,不能为模板参数指定默认值。以下是一个修改后的例子:
cpptemplatestruct Foo { // ...};
这段代码在C++98/03中是合法的,其中`U`和`N`是非类型模板参数,可以指定默认值。但如果你尝试为函数模板的模板参数指定默认值,比如:
cpptemplate // 错误:C++98/03不支持函数模板的默认模板参数void func() { // ...}
这会在C++98/03标准中产生错误。
在 C++98/03 标准中,类模板可以有默认的模板参数,如下:template <typename T, typename U = int, U N = 0> struct Foo { // ... }; 但是却不支持函数的默认模板参数:
template <typename T = int> // error in C++98/03: default template arguments void func() { // ... } 现在这一限制在 C++11 中被解除了。
本文共计1119个文字,预计阅读时间需要5分钟。
在C++98/03标准中,模板参数默认值仅适用于非类型模板参数,例如模板形参的默认值。对于函数模板,不能为模板参数指定默认值。以下是一个修改后的例子:
cpptemplatestruct Foo { // ...};
这段代码在C++98/03中是合法的,其中`U`和`N`是非类型模板参数,可以指定默认值。但如果你尝试为函数模板的模板参数指定默认值,比如:
cpptemplate // 错误:C++98/03不支持函数模板的默认模板参数void func() { // ...}
这会在C++98/03标准中产生错误。
在 C++98/03 标准中,类模板可以有默认的模板参数,如下:template <typename T, typename U = int, U N = 0> struct Foo { // ... }; 但是却不支持函数的默认模板参数:
template <typename T = int> // error in C++98/03: default template arguments void func() { // ... } 现在这一限制在 C++11 中被解除了。

