繁体   English   中英

如果我不重载它会使用内置的`operator->`吗?

[英]Will built-in `operator->` be used if I don't overload it?

内置的operator->被定义为(*p).m ,这对我的迭代器来说很好,所以重载它只会浪费我的时间和维护者的眼睛。

仅仅尝试它并不能保证可移植性,而且我还没有找到答案,尽管我担心它不是,因为显然以前没有人考虑过它。

更新:我做了一个最小的测试程序来实际尝试这个:

struct S { int m;};

struct P
{   auto& operator*() const { return s;}
    auto operator->() const =default;// { return &s;}
    S s;
};

int main()
{   P p;
    p->m;
}

g++ (Debian 8.3.0-6)仅在没有=default;//的情况下编译它,因此似乎默认或省略重载至少在几年内都不能移植。

如果我不重载它,会使用内置的operator->吗?

不,只有某些特殊的成员函数是为给定的类类型隐式声明的(在某些情况下也是如此)。 operator->不是其中之一。 这可以从特别成员中看出:

上面描述的六个特殊成员函数是在某些情况下隐式声明在类上的成员:

  • 默认 ctor
  • 托儿
  • 复制器
  • 复制作业
  • 移动 ctor
  • 移动分配

(强调我的)

请注意,在上面的列表中,没有提到operator-> 这意味着,如果您想将->与您的类类型的对象一起使用,那么您必须显式地重载它。


现在,就您遇到的错误提出问题。

仅使用注释掉的定义编译它,因此似乎默认或省略重载至少在几年内都不能移植。

您收到错误是因为operator-> cannot be defaulted 这可以从相同的特殊成员文档中看出:

每个类都可以明确选择其中哪些成员以其默认定义存在,或者分别使用关键字defaultdelete哪些成员。

(强调我的)

注意上面对“这些成员”的强调。 特别是,只有上面列出的六个特殊成员可以默认。 同样,由于operator->不是其中之一,因此不能使用default对其进行默认设置。

正如Anoop Rana所指出的,只有特殊的成员函数可以被默认,并且,正如Yksisarvinen所说,内置操作符-> 只存在于内置类型。

重载运算符中的冗余是一个长期公认的问题。 Boost::Operators为 CRTP 提供了常见的重载,包括模仿内置行为的 operator->:

#include <boost/operators.hpp>

struct S { int m;};

struct P : boost::dereferenceable< P, const S*>
{   auto& operator*() const { return s;}
    S s;
};

int main()
{   P p;
    p->m;
}

不幸的是,需要说明返回类型。 (恕我直言,它不应该是必需的。)单独它并不是向前迈出的一大步,但它被捆绑在像input_iteratable这样的常用组中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM