假设我有这个功能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);
好的。