C++:引用引用,Stroustrup示例

C++: References to References, Stroustrup Example

本文关键字:引用 示例 Stroustrup C++      更新时间:2023-10-16

Stroustrup C++第 4 版第 196 页有一个名为 Reference to References 的部分。 我已经包含了代码。 有没有人有使用这些参考文献的情况的例子?

我正在经历一个具有挑战性的概念化时间。 谢谢

using rr_i = int&&;
using lr_i = int&;
using rr_rr_i = rr_i&&; // ‘‘int && &&’’ is an int&&
using lr_rr_i = rr_i&; // ‘‘int && &’’ is an int&
using rr_lr_i = lr_i&&; // ‘‘int & &&’’ is an int&
using lr_lr_i = lr_i&; // ‘‘int & &’’ is an int&

换句话说,左值引用总是获胜。

他们不会。

注释显示删除了"额外"引用。这是一件好事,因为否则程序将是无效的(因为语言中没有"对引用的引用"(。

[dcl.ref]/6:如果一个typedef-name([dcl.typedef],[temp.param](或decltype-specifier表示一个类型TR,它是对类型T的引用,则尝试创建类型"对cvTR的左值引用"将创建类型"对T的左值引用",而尝试创建类型"对cvTR的右值引用"将创建类型TR[ 注意:此规则称为引用折叠。— 尾注 ] [ 示例:

int i;
typedef int& LRI;
typedef int&& RRI;
LRI& r1 = i;                    // r1 has the type int&
const LRI& r2 = i;              // r2 has the type int&
const LRI&& r3 = i;             // r3 has the type int&
RRI& r4 = i;                    // r4 has the type int&
RRI&& r5 = 5;                   // r5 has the type int&&
decltype(r2)& r6 = i;           // r6 has the type int&
decltype(r2)&& r7 = i;          // r7 has the type int&

— 结束示例 ]

这是一个使模板编程更容易的工具:您不必自己剥离"冗余"引用。可以说,您不会经常遇到对此的需求,但是在具有大量模板和/或别名的更复杂的代码库中,可能会发生这种情况。


当您有这样的函数模板时:

template <typename T>
void foo(T&& arg)

并传递一个左值int,那么你的arg将是一个int&;如果你传递一个右值int,那么它将是一个int&&。这称为"转发引用"(或"通用引用"(,与引用折叠的规则不同,尽管它在使模板编程更轻松方面确实具有类似的实用性。

这是一个参考

int i;
int& ii = i;

不能引用引用。这不是对参考的引用。ii 和 iii 都是对 i 的引用:

int i;
int& ii = i;
int& iii = ii;

这是一个右值引用

int&& r = 123;

这是无稽之谈,编译会失败。

int i;
int& ii = i;
int&& nonsense = &ii;//fail compilation
int&& nonsense2  = i;//fail compilation

但是指针可以被指向和引用

int i, j;
int* p = &i;
int** pp = &p;
int*& rp = p;
rp = &j;