【发布时间】:2019-09-24 12:52:15
【问题描述】:
考虑一下:
void test(int&& param){/*...*/}
int main(){
int a{444};
test(a);
}
当然它不会编译,因为没有为int 定义转换为int&&。但是下面的代码:
template<typename T>
void test(T&& param){/*..*/}
int main(){
int a=826;
test(a);
return 0;
}
将编译。但为什么?什么原因?后者没有什么特别之处,只是函数 test 将为所有类型 T 实例化。但是我们仍然需要传递右值作为参数。那么为什么它,后来,编译? - 没有任何抱怨。然后我尝试了以下方法:
template<typename T>
void test(T&& param){/*..*/}
template<typename T>
void test(T param){/*...*/}
int main(){
int a=826;
test(a);
return 0;
}
编译器会抱怨,因为函数调用在调用 test(T&& param) 与 T=int& 或 test(T param) 与 T=int 时不明确。
现在我完全不知道要推断什么。模板在这里有什么特别之处?为什么它不符合右值和左值的规则?
提前致谢
【问题讨论】:
-
Rvalue to forwarding references 的可能副本可能有更好的欺骗
标签: c++ templates parameter-passing c++14 generic-programming