C++11 可变模板类型推导

C++11 可变模板类型推导,c++11,C++11,当我想将可变模板参数包分为两部分时,我遇到了这个问题,第一部分包含所有元素,但最后一部分包含,第二部分仅包含最后一部分。我想到的一个直接实现是以下示例中的invoke1函数: template <typename... Ts> void invoke1(Ts... ts, int param) { } template <typename... Ts> void invoke2(int param, Ts... ts) { } int main() {

当我想将可变模板参数包分为两部分时,我遇到了这个问题,第一部分包含所有元素,但最后一部分包含,第二部分仅包含最后一部分。我想到的一个直接实现是以下示例中的
invoke1
函数:

template <typename... Ts>
void invoke1(Ts... ts, int param) {
}

template <typename... Ts>
void invoke2(int param, Ts... ts) {
}

int main() {    
    invoke1(1); // this works
    invoke2(1); // this works

    invoke1(1, 2, 3); // this does not work
    invoke1<int, int>(1, 2, 3); // this works
    invoke2(1, 2, 3); // this works

    return 0;
}
模板
void invoke1(Ts…Ts,int参数){
}
模板
void invoke2(int参数,Ts…Ts){
}
int main(){
invoke1(1);//这是可行的
invoke2(1);//这是可行的
invoke1(1,2,3);//这不起作用
invoke1(1,2,3);//这是有效的
invoke2(1,2,3);//这是有效的
返回0;
}
当首先指定模板参数包时,为什么不为
invoke1
推导模板参数?它会在类型推断中产生歧义吗

template <typename... Ts>
void invoke1(Ts... ts, int param) {
}
因此,使用
(1,2,3)
的调用现在完全有效

另一方面,如果不显式指定类型,编译器将无法知道参数包的结束位置。 是不是
invoke1(int,int,int,int)
调用1(int,int,int)

现在,您会说:“它不能只接受最后一个给定的参数并在它之前结束参数包吗?”。答案是否定的

另一方面,
invoke2
工作正常,因为参数包的开始和结束位置很清楚


根据经验,始终将参数包放在最后

>现在,您会说:“它不能只接受最后一个给定的参数并在它之前结束参数包吗?”。答案是否定的。为什么答案是否定的?这是我的主要问题。@Jodebo,因为这就是该功能是如何被指定和标准化的。但我认为标准中的很多东西都是按照“它只是工作”的方式制作的。我的问题是,为什么编译器不能推断模板参数?反对的理由是什么?它会在类型推断等方面产生歧义吗。?还是仅仅是语言缺陷,没有人提交论文?@Jodebo标准只规定这样的场景是非推断上下文。我还查阅了可变模板的建议,但他们也没有给出理由。如果有人找到一个好的来源,请随意编辑问题。
invoke1<int, int>(1, 2, 3); 
void invoke1(int, int, int);