2014-01-13 71 views
12

是下列完美标准所定义的?混合可变参数模板值和可变参数推导类型

#include <iostream> 

template <unsigned int... Values, class... Types> 
void f(Types&&... values) 
{ 
    std::cout<<sizeof...(Values)<<" "<<sizeof...(Types)<<std::endl; 
} 

int main() 
{ 
    f<7, 5>(3); 
    return 0; 
} 

它很好地编译在g++ 4.8但我不知道是否是正常的。

+0

嗯,我不擅长围绕标准段落,但为什么你不会指望工作?积分是有效的模板参数值,并且参数的类型推导在很长时间内也存在。 – Vinzenz

+0

当你的'Types'从你的函数参数推断,你的'Values'明确规定,既然'5'是最绝对*不* A *类型*,我也很难看到如何,这并不完全按照您指定的(和预期)进行编译。你会期望什么可能是不符合标准的问题? – WhozCraig

+14

[temp.param]/11“的功能模板的模板参数包不应被随后的另一个模板参数 除非该模板参数可以从参数*类型列表来推断*函数模板的 或具有默认参数“所以我会说这是合法的,除非'Types'只出现在非推导的上下文中。 – dyp

回答

2

ISO C++ standard's current working draft 14.1(11):

函数模板的模板参数包不应被随后的另一个模板>参数,除非该模板参数可以从推导出的参数类型列表>函数模板或具有默认参数

在你的情况“类型”是函数参数包和“价值”,这是一个模板参数包,可总是跟着一功能参数包。 此代码的工作原因是相同的:

#include <iostream> 

template <class... Values, class... Types> 
void f(Types&&... values) 
{ 
    std::cout<<sizeof...(Values)<<" "<<sizeof...(Types)<<std::endl; 
} 

int main() 
{ 
    f<int, float>(-3, 5); 
    return 0; 
}