c++ - 重载 operator-> 当 operator* 临时返回时

标签 c++ operator-overloading temporary-objects

我有两个具有以下结构的类:

struct A {
  A transform() const;
};

struct B {
  // returns a temporary A
  A operator*() const;
};

* 运算符在这里可能看起来有点奇怪,但考虑到它的用法实际上是很自然的。事实上,B 的存在只是为了为嵌入式语言提供一些语法糖,因此它的方法和运算符旨在为代码提供所需的外观。给定 B b,获取关联的 A 很快,*b。有时我想立即调用 A 上的转换。目前,这需要一些额外的括号 (*b).transform()。似乎有一个自然的简化,即 b->transform()。但是 operator -> 应该返回一个指针,而 operator * 返回一个临时指针。我怎样才能实现这样的重载?

最佳答案

免责声明:对于因更改重载运算符的值类别而不是其内置运算符而引起的任何混淆,我概不负责。

struct just_some_type
{
    int m;

    int transform() { return m; }
};

// the intermediate helper stops the recurring application of ->
// if the lhs of -> is of a class type
struct intermediate_helper
{
    just_some_type member;

    just_some_type* operator->() { return &member; }
};

struct ptr_like
{
    just_some_type operator*()
    { return {42}; }

    intermediate_helper operator->()
    { return {{42}}; }
};

使用示例:

#include <iostream>

int main()
{
    auto p = ptr_like{};
    std::cout << (*p).transform() << "\n";
    std::cout << p->transform() << "\n";
}

重要说明: p-> 中作用的对象是左值,因为内置的 -> 应用于指针!例如。如果您使用像 int transform() &; 这样的左值引用来限定 transform,那么版本 (*p).transform() 将编译失败,但是 p->transform() 仍然是合法的。

关于c++ - 重载 operator-> 当 operator* 临时返回时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22028313/

相关文章:

c++ - 基于 C++ 标准的定义实现 `is_similar` 类型特征

C++ - 如何为类模板声明函数模板友元

c++ - 我可以阻止创建 C++ 类的非临时实例吗?

c++ - 初始化器究竟是什么时候被临时销毁的?

C++:如何从数组生成随机数

c++ - 访问从模板类派生的类中的基本成员函数

c++ - 为 Matrix 设计一个简单的 C++ 迭代器

C++ 找不到错误、双重释放或损坏 (fasttop)

c++ - 运算符重载如何在 cpp 中进行排序?

rust - Rust 中涉及临时对象的销毁顺序