我们Point
是一个类,其实例可以明确地浇铸为wxPoint
:
class Point{ private: int x; int y; public: explicit operator wxPoint() const { return wxPoint(x, y); } // More stuff }
我有一个函数返回对类型对象的引用Point
.这样一个函数的标题是:
const Point& GetPoint();
我的问题:定义以下Foo
功能是否安全?
const wxPoint& Foo() const{ return (wxPoint&) GetPoint(); }
首先我实现Foo
了return (wxPoint) GetPoint();
,但是创建了一个新的(本地)对象,因此触发了一个有用的警告.此处显示的代码在没有警告的情况下编译.
我在这种类型的转换中找到的所有信息都是指继承的类,但这不是这种情况.
在以这种方式投射参考时究竟会发生什么的解释将非常感激.
实际上你的转换操作符从不被调用.您正在返回对point
实例的引用GetPoint
.后来你使用了一个C风格的演员,在你的情况下将相当于一个reinterpret_cast<>
(见这里).您正在将引用Point
转换为引用wxPoint
,并且这两个类型是完全不相关的类型.另一方面,对返回引用的任何操作都是未定义的行为.
我的建议是始终使用C++强制转换运算符.他们有好处:
编译器检查C++样式转换.
可以轻松搜索C++样式转换.
C++样式转换表达了程序员的意图.
其他答案已经解释,铸造Point&
于wxPoint&
简单地在于编译器,告诉它引用绑定到的对象是一个wxPoint
对象,这是不正确的.如果尝试wxPoint
通过该引用访问对象,则程序将具有未定义的行为,因为它未绑定到wxPoint
对象.有时候当你骗到编译器时,它不能给你警告,只是要相信你没有做一些疯狂的事情.
修复是停止尝试返回对不存在的对象的引用:
wxPoint Foo() const { return GetPoint(); }
这将使用您的转换运算符构造一个wxPoint
并按值返回,这是可以的.当没有任何东西可以绑定引用时,尝试通过引用返回是不行的.