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
}