【问题标题】:How to prevent size_t from being interpreted as reference?如何防止 size_t 被解释为参考?
【发布时间】:2016-06-26 15:59:03
【问题描述】:

如何更改distanceTo(..) 的签名以使编译器在以std::size_t 作为参数的调用时发出警告或错误?

class Point {
private:
  float value;

public:
  Point(float value) : value(value){};
  float distanceTo(const Point &point) { return point.value - value; }
};

int main() {

  std::size_t index = 1;
  Point start(1);
  Point end(4);
  float dist = start.distanceTo(index); // compiles, but should not!
  std::cout << dist;

  return 0;
}

【问题讨论】:

  • 问题是:“如何防止隐式类型转换?” (你应该调整标题)
  • 是的,Point 不是指针。
  • 用户 LogicStuff 和 cpluplusrat 发布时间仅在瞬间不同。 LogicStuff 之后添加了解释和链接。
  • @VisorZ point 是否通过值或引用传递在这里并不重要。转换语义是相同的。请注意,传递 size_t 并不会使 &amp;point 等于它。构造函数接受它,然后临时对象绑定到 const 引用。

标签: c++ class constructor implicit-conversion


【解决方案1】:

制作构造函数explicit:

explicit Point(float value) : value(value) {} // no semicolon here

这不允许隐式转换(从size_tfloatPoint),但请注意,它也会使start.distanceTo(3.14)Point p = 3.14; 等代码无效。

【讨论】:

    【解决方案2】:

    使构造函数显式。将Point(float value) 更改为explicit Point(float value),问题就会消失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多