【发布时间】:2014-10-07 20:18:04
【问题描述】:
C++ 允许通过创建 operator T() 来重载类型转换,其中 T 是我们要转换为的类型。
现在,此功能如何与引用一起使用?例如:
struct Y{ int i; };
struct X{
Y y;
operator Y() const { return y; }
};
在这里,我们可以将X 转换为Y,这将简单地返回包含的Y。但是,如果我们想对 Y 引用进行强制转换怎么办。例如,C++ 允许我们这样做:
struct X{
Y y;
operator Y&(){ return y; }
operator const Y&() const { return y; }
};
现在,我们可以将X 转换为Y 引用或const 引用(这也适用于const X)。
第一个例子和第二个例子的语义有什么不同吗?如果我想允许转换为引用,最好的方法是什么?
我可以想象,即使我写了operator T() 没有任何&,C++ 也可能允许强制转换通过引用返回结果(即,当我指定operator T() 时,它可能会以某种方式添加隐式operator T&() 方法) .
例如,我希望下面的代码工作:
int main(){
X x;
Y& y = x; // y now references the y inside x
y.i = 5;
std::cout << x.y.i << std::endl; // Should print 5 now
}
实现这一目标的最简单方法是什么?
【问题讨论】:
-
您是在问返回值和引用之间的语义差异,还是返回 const 和非 const 引用之间的语义差异?
-
@Useless:我在问:声明
operator T()(没有&)是否意味着强制转换总是按值返回T?还是有一些规则可以在某些情况下返回T作为参考?我试图澄清这个问题。
标签: c++ casting reference operator-overloading