Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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++ 什么';通用参考的标准/官方名称是什么?_C++_C++11_C++14_Universal Reference_Forwarding Reference - Fatal编程技术网

C++ 什么';通用参考的标准/官方名称是什么?

C++ 什么';通用参考的标准/官方名称是什么?,c++,c++11,c++14,universal-reference,forwarding-reference,C++,C++11,C++14,Universal Reference,Forwarding Reference,我知道,如果一个变量或参数被声明为某个推断类型的T&,该变量或参数被广泛称为通用参考 Scott Meyers在其原始演讲中介绍了“通用参考”一词。然而,我想知道通用参考的官方/标准术语是什么 众所周知,自C++11以来,T&类型的参数称为右值参考[ISO/IEC 14882:2011§8.3.2/p2参考[dcl.ref]]。也就是说,除非T是模板参数类型,或auto或某个左值引用类型的typedef 示例: template<typename T> void foo(T&

我知道,如果一个变量或参数被声明为某个推断类型的
T&
,该变量或参数被广泛称为通用参考

Scott Meyers在其原始演讲中介绍了“通用参考”一词。然而,我想知道通用参考的官方/标准术语是什么 众所周知,自C++11以来,
T&
类型的参数称为右值参考[ISO/IEC 14882:2011§8.3.2/p2参考[dcl.ref]]。也就是说,除非
T
是模板参数类型,或
auto
或某个左值引用类型的
typedef

示例:

template<typename T>
void foo(T&& p) { // -> T is a template parameter
  ...
}

auto &&p = expression;
-[结束示例]

§14.8.2.5/p10从类型[临时扣除类型]中扣除模板参数:

类似地,如果p有一个包含(T)的形式,那么每个参数类型 将P的各个参数类型列表的Pi与 对应系统的对应参数类型Ai A的参数类型列表。如果P和A是 源于获取函数地址时的演绎 模板(14.8.2.2)或从 函数声明(14.8.2.6)和Pi和Ai是 P和A的顶级参数类型列表,分别调整Pi 如果它是转发参考(14.8.2.1),并且Ai是左值 引用,在这种情况下,Pi的类型更改为模板 参数类型(即T&&更改为简单的T)。[注:作为 结果,当Pi为
T&
且Ai为
X&
时,调整后的Pi为T, 使T推断为
X&
-结束注释][示例:

template <class T> void f(T&&);
template <> void f(int&) { } // #1
template <> void f(int&&) { } // #2
void g(int i) {
f(i); // calls f<int&>(int&), i.e., #1
f(0); // calls f<int>(int&&), i.e., #2
}
模板无效f(T&&);
模板空f(int&){}/#1
模板空f(int&){}/#2
无效g(内部i){
f(i);//调用f(int&),即#1
f(0);//调用f(int&&),即#2
}
-结束示例]如果Pi对应的参数声明是 函数参数pack,然后比较其声明符的类型 与A的参数类型列表中的每个剩余参数类型。 每次比较都会为中的后续位置推断模板参数 模板参数包由函数参数包展开。 在偏序期间(14.8.2.4),如果Ai最初是一个函数 参数包:


如果引用“自C++11以来,已知T&&类型的参数称为右值引用”,将不胜感激。特别是,如果
T
int&
,则
T&&
的引用在标准中仍然称为右值引用。@Yakk我同意我将尝试找到它的标准措辞。“也就是说,除非
T
是模板参数类型或
auto
”或者是一些LValk引用类型的Type,@ 101010可以自由编辑C++标准,你是说?brb…:)dcl.ref/6——如果
TR
int&
,尝试创建类型“对
TR
的右值引用”将创建
TR
。使用“试图创建”意味着此处实际上没有出现右值引用;相反,它只是“试图创建一个右值引用”<如果
T
是引用类型,则code>T&&不是右值引用,因为dcl.ref/5不应引用引用。本质上,
TR&&
其中
TR
是引用,在dcl.ref/6之前,它不是有效的构造(因此没有名称)。在dcl.ref/6之后,表示
TR
。。。大概
template <class T> void f(T&&);
template <> void f(int&) { } // #1
template <> void f(int&&) { } // #2
void g(int i) {
f(i); // calls f<int&>(int&), i.e., #1
f(0); // calls f<int>(int&&), i.e., #2
}