使 C++ return 中的重载成员访问运算符成为临时的
Making overloaded member access operator in C++ return a temporary
我想写 class 类似于下面,其中 IteratorLike
只能被取消引用到一个新值,因为迭代器提供了一个不同于底层结构的视图,使得 return 一个简单的参考是不可行的。
class IteratorLike
{
public:
MyValue operator*() const { return MyValue(...); }
auto operator->() const { return **this; } // This does not work generally due to member access semantics.
};
总而言之,我只想 IteratorLike()->x
与 的意思相同 与 (*IteratorLike()).x
。
可以简单地在 MyValue
class 中重载 operator->()
,但我希望它在所有情况下都能正常工作。
使用重载 operator->()
的包装器类型似乎是一个合理的解决方案,但在 returning 右值时这不起作用。
在 the example on godbolt 中是此类包装器的有效实现,包括由于悬挂引用而导致的未定义行为。
有没有办法让它工作?
如果包装器可以 return 一个指向纯右值的指针,那么在我看来,int &qa = MyIteratorLike()->x;
行会被编译器捕获,但这样的事情似乎是不可能的。
Is there a way to make this work?
没有。值类别是表达式的 属性,而不是类型。 "pointer to prvalue"不是东西
我想写 class 类似于下面,其中 IteratorLike
只能被取消引用到一个新值,因为迭代器提供了一个不同于底层结构的视图,使得 return 一个简单的参考是不可行的。
class IteratorLike
{
public:
MyValue operator*() const { return MyValue(...); }
auto operator->() const { return **this; } // This does not work generally due to member access semantics.
};
总而言之,我只想 IteratorLike()->x
与 的意思相同 与 (*IteratorLike()).x
。
可以简单地在 MyValue
class 中重载 operator->()
,但我希望它在所有情况下都能正常工作。
使用重载 operator->()
的包装器类型似乎是一个合理的解决方案,但在 returning 右值时这不起作用。
在 the example on godbolt 中是此类包装器的有效实现,包括由于悬挂引用而导致的未定义行为。
有没有办法让它工作?
如果包装器可以 return 一个指向纯右值的指针,那么在我看来,int &qa = MyIteratorLike()->x;
行会被编译器捕获,但这样的事情似乎是不可能的。
Is there a way to make this work?
没有。值类别是表达式的 属性,而不是类型。 "pointer to prvalue"不是东西