c++ - 为什么可以通过复制或引用返回相同的表达式?
问题描述
T& operator[]();
我知道and之间的区别T operator[]()
,前者返回引用,后者返回结果的副本。
但是让我感到困惑的是,对于container[idx]
声明中的两种不同类型的返回类型,可以在 return 语句中使用相同的表达式。
编译器如何实现这个目标(一个返回引用,另一个返回副本)?
这是代码片段:
template<typename T>
class Array
{
public:
#ifdef RETURN_REFERENCE
T& operator[](int idx)
#else
T operator[](int idx)
#endif
{
assert(idx<size);
return container[idx]; // same expression works for T and T&
}
private:
enum {size =100};
T container[size];
}
解决方案
它与这种情况基本上没有什么不同:
int i = <whatever>;
int &j = i; //Reference
int k = i; //Copy
i
表达式并不孤单。它在特定的上下文中使用,并且该上下文的性质决定了表达式会发生什么。
该return
语句在返回值类型的上下文中执行。例如,如果返回的表达式与返回值的类型不同,编译器将尝试将表达式转换为适当的类型(很像float q = i;
转换i
为 a float
)。
表达式本身只是标识一个对象。被识别的对象会发生什么取决于它的使用方式。如果它用于初始化引用,则创建对该对象的引用。如果它用于初始化该类型的另一个对象,则创建一个副本。
推荐阅读
- javascript - 视频滑块如何自动播放下一个视频
- go - Cookie 随机设置
- javascript - 使用javascript打印图像
- swift - 如何将 Imebra v5 集成到 swift 命令行项目中
- java - 休眠查询以匹配映射实体集合与给定集合中的至少一个元素,多对多关系
- c++ - 在 Qt 中的多个页面上打印大文本
- d3.js - d3.js - generate color table from array
- amazon-web-services - EC2 Auto Scaling 终止实例
- powershell - 如何使用联合 SAML (AzureAD) 登录名登录 AWS CLI
- swift - 移动/删除 Diffable TableView 行