以下链接提供了4种形式的引用折叠(如果我是正确的,这些是唯一的4种形式):http://thbecker.net/articles/rvalue_references/section_08.html.
从链接:
- A &&成为A&
- A &&&成为A&
- A &&&成为A&
- A && &&成为A &&
虽然我可以做出有根据的猜测,但我想简要解释这些参考折叠规则背后的基本原理.
一个相关的问题,如果可能的话:在典型的实际用例中,这些STL实用程序(例如,等)在C++ 11内部使用这些引用折叠规则吗?(注意:我特别询问C++ 11中是否使用了引用折叠规则,而不是C++ 03或更早版本.)std::move()std::forward()
我问这个相关的问题,因为我知道这样的C++ 11实用程序std::remove_reference,但我不知道是否与std::remove_referenceC++ 11中常规使用的引用相关的实用程序,以避免需要引用 - 折叠规则,或者它们是否与参考折叠规则一起使用.
下面的代码编译(gcc 4.7.2或icc 13)并产生"1 2"输出.这意味着const限定符被删除,即f<int&>具有参数类型int&.
为什么会这样?据我了解,根据§14.3.1.4:
如果一个模板参数的模板参数
T名称的类型"参考CV1S",企图制造型"参考CV2T"创造型"参考CV12S",其中CV12是CV-合格网络ERS的联合CV1和cv2.冗余的cv-quali firs被忽略.
const不应该被丢弃.这是代码:
#include <iostream>
using namespace std;
template <typename T>
void f(const T& t)
{
t++;
}
int main()
{
int a = 1;
cout << a;
f<int&>(a);
cout << ' ' << a << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)