【问题标题】:How is this [] operator overloaded?这个 [] 运算符是如何重载的?
【发布时间】:2017-05-03 13:49:33
【问题描述】:

我正在尝试自己构建一个 2D 矢量类。

当我在寻找其他人实现的示例代码时,我发现了这个:

class Vector2D {
 public:

  // components
  double x, y;

  Vector2D() : x( 0.0 ), y( 0.0 ) { }

  // returns reference to the specified component (0-based indexing: x, y)
  inline double& operator[] ( const int& index ) {
    return ( &x )[ index ];
  }
}

[] 运算符是如何重载的?我怎么理解(&x)[index]

【问题讨论】:

  • 你发现了垃圾。将您的学习材料更改为 makes sense.
  • 我相信这个例子是未定义的行为。它依赖于y 紧跟在内存中的x 之后,我不确定这是否得到保证。
  • const int& index 是过早的悲观主义。它增加了一层没有任何增益的间接层。

标签: c++ class operator-overloading


【解决方案1】:

[] 运算符是如何重载的?

很糟糕。

我怎么理解(&x)[index]

这行代码假装我们可以使用指针算法安全地在类的成员之间导航。我们不能。密码坏了。

此外,通过 const 引用获取 int 只是愚蠢的;基本上没有办法对优化器有用。 ints 很小,甚至可能更小 比您的编译器可能需要“在后台”实现此引用的指针。

【讨论】:

  • 我不太确定它坏了; Vector2D 因为它是标准布局(实际上,它甚至是 POD),并且标准为标准布局类在内存中的布局提供了更强有力的保证。
  • @MatteoItalia:你根本不能使用指针算法来“跳转”这样的对象,不管它们的布局是什么。 C++14 5.7/5 很清楚这是 UB。
  • @BoundaryImposition 参考标准非常重要,足以成为答案的一部分。
猜你喜欢
  • 1970-01-01
  • 2020-02-08
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多