当重载运算符->
时,最终将不得不返回一个指针。如果此指针指向在函数内部创建的对象,例如:
struct Something {
char c;
Something(char k){
c = k;
}
};
struct Hello {
int a;
Something* operator->(){
Something s(a);
return &s;
}
};
然后将取消引用此结果导致未定义的行为(如Can a local variable's memory be accessed outside its scope?):
Hello h {5};
cout << h->c;
如果可以,仍然可以使用operator->
来解决吗?
答案 0 :(得分:1)
然后取消引用此结果会导致未定义的行为?
是的
如果可以,仍然可以使用
operator->
来解决吗?
以下内容适用于任何其他成员函数。
创建Something
实例作为Hello
的成员。然后指向它的指针在Hello
的生存期内一直有效。您可以从立即存储的整数构造Something
,以便摆脱它。
如果Something
占用了更多资源(内存,句柄等),则您可能想在operator->
调用时构造它。您可以为此选择std::unique_ptr
(动态)或std::optional
(静态)。或者,如果Something
支持未初始化状态(例如,默认构造),则可以稍后对其进行初始化(例如,移动分配)。
如果您无法更改Hello
类,那么您唯一的选择是重载operator->
以按值直接返回Something
。
但是,我必须说,此问题的情况开始变得怪异,并且使操作符重载的方式更加严重。