假设我有这个功能copy
:
template <typename Buf>
void copy(
Buf&& input_buffer,
Buf& output_buffer)
{}
其中input_buffer
是一个通用参考并且output_buffer
是一个左值参考。
Reference collapsing rules
确保input_buffer
确实是,无论推导的类型如何Buf
,都是通用参考,并且output_buffer
确实是左值参考。
但是,我想知道Buf
这里是如何推断类型的。
我发现copy
传递了一个 r-value as input_buffer
,(和一个 l-value as output_buffer
,显然)Buf
是一个非引用类型。
但是,如果我要传递两个 l 值,则程序不会编译:
int i = 4;
int j = 6;
_copy(i, j);
我希望编译器推断Buf
为int&
. 遵循引用折叠规则,我希望input_buffer
成为左值引用,即& + && -> &
,并且output_buffer
也成为左值引用;& + & -> &
.
所以问题是:为什么这段代码不能编译?
(注意:我不一定要求解决问题,而是要求解释。)
如果我需要详细说明,请随时询问。
编辑:如果调用:copy(i, j);
GNU GCC 编译器给出:错误:没有用于调用“复制(int&,int&)”的匹配函数注:候选:模板无效副本(Buf&&,buf&)注:模板参数推导/替换失败:注:推导参数“Buf”(“int&”和“int”)的冲突类型
如果打电话:
copy<int&>(i, j);
好的。