Kan*_* Li 10 c++ templates c++11
以下代码在gcc-4.7.1上编译:
struct X {};
template <class T = X, typename U>
void f(const U& m) {
}
int main() {
f<>(0);
}
Run Code Online (Sandbox Code Playgroud)
但是,这个没有:
struct X {};
template <class T = X, typename U>
void f(const U& m) {
auto g = [] () {};
}
int main() {
f<>(0);
}
Run Code Online (Sandbox Code Playgroud)
gcc-4.7.1抱怨:
c.cpp: In function 'void f(const U&)':
c.cpp:5:15: error: no default argument for 'U'
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:在函数模板中将非默认参数置于默认参数之前是否正确?如果是的话,为什么不编译第二个呢?如果不是,为什么第一个编译?C++ 11标准如何说明这种语法?
Fle*_*exo 11
明确禁止类和别名.n3290§14.1.11规定:
如果类模板或别名模板的模板参数具有默认模板参数,则每个后续模板参数应具有提供的默认模板参数或者是模板参数包
对于函数,唯一的限制似乎与参数包有关:
除非可以推导出模板参数或具有默认参数,否则函数模板的模板参数包不应该跟随另一个模板参数
但很明显,这与此案无关.
鉴于§14中没有任何内容禁止它的功能,我们似乎必须假设它是允许的.
工作组报告中的一份说明似乎证实了这是意图.该部分最初提出的措辞是:
如果类模板的模板参数具有默认模板参数,则所有后续模板参数都应提供默认模板参数.[注意:这不是函数模板的要求,因为可能会推导出模板参数(14.8.2 [temp.deduct]).
虽然我看不出那张纸条在最终版本中的位置.
| 归档时间: |
|
| 查看次数: |
725 次 |
| 最近记录: |