别名的别名
An alias for an alias?
本文关键字:别名 更新时间:2023-10-16
是否可以
为引用变量(别名本身的别名(创建引用?
如果是,它的应用是什么?
在 C++98 中,形成对引用类型的引用是非法的。在 C++11 中,有了新的引用折叠规则,简而言之,这意味着对引用的引用仍然只是一个引用(但关于左值和右值引用存在微妙之处(。请考虑以下代码:
typedef int & ir;
int a;
ir & b = a;
在 C++98 中,最后一行是非法的,因为ir &
不是有效类型(尝试引用引用(。在 C++11 中,引用折叠,ir &
与 int &
相同。
是不可变的,一旦初始化,您将永远无法更改引用的目标。在上面的代码中,b
将始终是 a
的别名,并且永远不能更改为其他名称的别名。因此,不需要双重间接,因为它不允许你做任何超出普通引用可以做的事情。
为完整起见,引用折叠规则如下。假设T
不是引用类型。那么从概念上讲,我们有:
(T&)& == T& (T&)&& == T& (T&&)& == T& (T&&)&& == T&&
不能创建对引用的引用,并且C++没有对引用的引用类型。
如果使用一个引用初始化另一个引用,例如:
int i = 1;
int &a = i;
int &b = a;
然后你实际所做的是将a
的引用绑定到b
。 a
是同一对象的名称,i
是其名称,因此int &b = a;
与 int &b = i;
具有完全相同的效果。因此,您有两个对同一对象的引用,i
。
我不能立即想到在同一函数中有两个引用的原因,但是如果您有一个接受引用参数的函数f
,并将其传递给另一个也接受引用参数的函数g
,您通常会创建多个引用。然后f
和g
分别具有对同一对象的引用。
在 Python 中,像这样:
a = 1
b = a
经过此处理后,"A"和"B"的 ID 是相同的。
相关文章:
- 部分定义/别名模板模板参数
- 如何在C++20中创建模板别名的推导指南
- 告诉c++编译器该参数没有别名
- boost::spirit::karma 替代生成器,带有 boost::variant 由字符串和字符串别名组成
- 继承模板类中的类型别名
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 如何使用类型别名从模板化类中隐藏模板列表
- 模板模板参数和模板别名:编译器错误?
- 使用定义函数模板别名
- 为模板参数包添加别名
- 如何检测类型类型别名?
- C++类型别名,其中值被替换
- C++使用默认模板参数键入别名和转发声明
- 在Qt中注册自定义元类型的别名类型
- 缺少别名模板C++参数列表
- 使用外部定义的模板类型作为模板参数的更通用模板的模板别名