以下代码在 gcc-4.7.1 上编译:
struct X {};
template <class T = X, typename U>
void f(const U& m) {
}
int main() {
f<>(0);
}
然而,这个没有:
struct X {};
template <class T = X, typename U>
void f(const U& m) {
auto g = [] () {};
}
int main() {
f<>(0);
}
gcc-4.7.1 抱怨:
c.cpp: In function 'void f(const U&)':
c.cpp:5:15: error: no default argument for 'U'
所以我的问题是:在函数模板中将默认参数放在非默认参数之前是否正确?如果是,为什么第二个不能编译?如果不是,为什么第一个可以编译? C++11 标准如何描述此语法?
明确禁止类和别名。 n3290 § 14.1.11 规定:
如果类模板或别名模板的模板参数具有默认模板参数,则每个后续模板参数
模板参数应提供默认模板参数或者是模板参数
盒
对于函数,唯一的限制似乎与参数包有关:
函数模板的模板参数包不得
后跟另一个模板参数,除非该模板参数可以推导或具有默认值
争论
但显然这与本案无关。
鉴于第 14 条中没有任何内容禁止它的功能,我们似乎必须假设它是允许的。
A 工作组报告的说明 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226似乎证实了这就是意图。该节最初提议的措辞是:
如果类模板的模板参数具有默认模板参数,则所有后续模板参数都应提供默认模板参数。 [笔记:这不是函数模板的要求,因为可能会推导出模板参数(14.8.2 [温度扣除]).]
但我看不出最终版本中该注释的去向。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)