【问题标题】:Overloading operator-> in C++在 C++ 中重载 operator->
【发布时间】:2011-06-09 18:10:41
【问题描述】:

我有一个智能指针类,我想重载operator->;它是为了方便而提供的,因此我可以直接访问包含在智能指针中的类的成员。

我正在研究 Boost 在其 shared_ptr 模板中实现此运算符的方式。我注意到他们在返回指针之前添加了一个断言检查指针是否确实非空。目前,我的运算符返回指针而不检查它是否为空(本质上,空指针在我当前的实现中是未定义的行为)。我也应该添加这个断言吗?

(另外,这个操作符是怎么叫的?我在网上找不到这个。)

【问题讨论】:

  • 称自己的班级“聪明”任何事情都是灾难的根源。
  • 您是否想要未定义的行为?它 100% 是您在实施中的选择。我认为这里没有人能告诉你是应该还是不应该添加这样的功能。
  • @Tomalak 这就是他们所说的——智能指针。名字不是我编的。 ;)
  • 我知道他们是这么称呼的(有些人)。这仍然是灾难的根源。
  • @Tomakal 假设你不是在开玩笑......名字怎么会成为灾难的根源? Boost 也是一场灾难吗(见boost/smart_ptr/)?

标签: c++ operator-overloading


【解决方案1】:

这取决于你。您可以简单地记录将它与空指针一起使用是未定义的并且什么都不做,您可以断言,您可以抛出异常。没有正确的答案。就个人而言,我可能会抛出异常。

【讨论】:

  • 好的,谢谢!我提出了一个断言:如果我最终试图通过空指针调用一个函数,那将是我作为程序员的错。 (至少在我的应用程序中,因为没有用户可以提供的输入会在 null 上调用 operator->。)
【解决方案2】:

我也应该添加这个断言吗?

如果没有它你很开心,那很好。 只要确保记录在案:这很重要。

(另外,这个操作符是怎么叫的?我在网上找不到这个。)

它真的没有名字。该标准只是将其称为“-> 运算符”,也将其称为“类成员访问运算符之一”([expr.const])。

Wikipedia lists 它是“a 指向的对象的成员 b”(是的,其他运算符被赋予简洁的标识符)。

【讨论】:

  • 我通常只称它为“other 解引用运算符”。 :-P
  • 我称之为“箭头”运算符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
相关资源
最近更新 更多