2015-12-21 119 views
1

为什么在下列情况下无法明确指定d明确指定位于模板参数包后的默认模板参数

#include <iostream> 

template< typename a, typename b = int, typename ...c, typename d = int > 
int 
f(a, b, c..., d) 
{ 
    return sizeof...(c); 
} 

int 
main() 
{ 
    std::cout << f< int, int, int, int/*, char*/ >(1, 2, 3, 4, 'd') << std::endl; 
    return 0; 
} 

如果我去掉最后一个模板参数,那么我期待输出2,而是我得到一个硬错误:

main.cpp:14:18: error: no matching function for call to 'f' 
    std::cout << f< int, int, int, int, char >(1, 2, 3, 4, 'd') << std::endl; 
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
main.cpp:6:1: note: candidate function not viable: requires 6 arguments, but 5 were provided 
f(a, b, c..., d) 
^ 
1 error generated. 

什么是否认在这种情况下,规则?

+3

c其余 –

+0

@DieterLücking我也怀疑这个,但是处理模板参数包和默认参数的规则是什么? – Orient

+0

为什么可变包装最后结束的另一个原因。 – 101010

回答

5

因为包是贪婪的。因此char实际上是c的一部分,因此您需要提供与d相关的参数,该参数由于默认设置而属于int类型。

+0

因此'template void f(A ...,T){return; }'是完全错误的结构,但是被语言规则所允许,不是吗? – Orient