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