首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载操作符->何时操作符*返回临时

重载操作符->何时操作符*返回临时
EN

Stack Overflow用户
提问于 2014-02-25 23:15:10
回答 1查看 98关注 0票数 4

我有两个类,其结构如下:

代码语言:javascript
复制
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 *是返回一个临时的。我如何实现这样的过载?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-25 23:35:02

免责声明:我不负责任何混乱,因为改变的价值类别的重载运算符与他们的内置对应。

代码语言:javascript
复制
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}}; }
};

用法示例:

代码语言:javascript
复制
#include <iostream>

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

重要注意事项:p->中操作的对象是一个lvalue,因为内置的->应用于指针!例如,如果将transform限定为lvalue-ref (如int transform() &; ),那么(*p).transform()版本将无法编译,但p->transform()仍然是合法的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22028313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档