Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数模板演绎l值参考和通用参考_C++_C++11_Function Templates_Forwarding Reference_Template Argument Deduction - Fatal编程技术网

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);