【发布时间】:2012-07-25 23:07:53
【问题描述】:
以下代码在 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 标准对这种语法有什么看法?
【问题讨论】:
-
@Andrew,你发的帖子太长了。您能否指出哪个答案表明将默认参数放在非默认参数之前是否正确?
-
@icando:标准中没有任何内容禁止将函数模板的默认模板参数放在任何地方。只有 class 模板受到限制。
-
@KerrekSB,所以代码不被接受只是gcc bug?
-
@KerrekSB - 我刚刚得出了同样的结论。有趣的是,我的机器上的 clang3 .0 在 gcc 拒绝的情况下出现了段错误。