C++ 函数模板演绎l值参考和通用参考
假设我有函数C++ 函数模板演绎l值参考和通用参考,c++,c++11,function-templates,forwarding-reference,template-argument-deduction,C++,C++11,Function Templates,Forwarding Reference,Template Argument Deduction,假设我有函数copy: template <typename Buf> void copy( Buf&& input_buffer, Buf& output_buffer) {} 我希望编译器将Buf推断为int&。按照引用折叠规则,我希望input\u buffer成为一个l值引用,也就是说,&+&&&->&,output\u buffer也成为一个l值引用&+&->& 所以问题是:为什么这段代码不编译 (注意:我不一定要问问题的解决方案
copy
:
template <typename Buf>
void copy(
Buf&& input_buffer,
Buf& output_buffer)
{}
我希望编译器将Buf
推断为int&
。按照引用折叠规则,我希望input\u buffer
成为一个l值引用,也就是说,&+&&&->&
,output\u buffer
也成为一个l值引用<代码>&+&->&
所以问题是:为什么这段代码不编译
(注意:我不一定要问问题的解决方案,而是要解释。)
如果我需要详细说明,请随时提问
编辑:
如果调用:复制(i,j)代码>
GNU GCC编译器提供:
错误:调用“copy(int&,int&)”时没有匹配的函数
注:候选:模板无效副本(Buf&&,Buf&)
注意:模板参数扣除/替换失败:
注意:参数'Buf'('int&'和'int'的推断冲突类型)
如有需要,请致电:
拷贝(i,j)代码>
好。a)转发参考的类型扣除:
[a.2]通过时,右值T
被推断为T
。你有吗
void f(T& && ){} -after reference collapsing-> void f(T&){}
void f(T&& ) {}
b) 除转发引用外,引用的类型扣减:
因为第一个参数的类型推断返回Buf==int
,因为您传递了20个右值。
第二个参数的推导结果也返回Buf==int
。所以在这两方面
案例Buf
相同,代码编译
未编译的代码:
int i = 4;
int j = 6;
_copy(i, j);
int i=1;
int j=2;
copy(i,j);
第一个参数的推导类型是什么?您正在传递L值,因此Buf
是int&
。
第二次扣减返回Buf==int
。这两种推断的类型是不一样的,这就是为什么
代码无法编译。我不知道Buf是否可以同时作为通用引用和普通引用进行推导。将函数模板化为两种类型确实可以解决问题,但约束比您可能希望的要多。顺便说一句,最好包含一个,包括您收到的编译器错误。
template<class T>
void f(T& param){}
int i = 10;
copy(20,i);
int i=1;
int j=2;
copy(i,j);