如何防止size_t被解释为引用?

时间:2016-06-26 15:59:03

标签: c++ class constructor implicit-conversion

如何更改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;
}

2 个答案:

答案 0 :(得分:13)

制作构造函数explicit

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

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

答案 1 :(得分:4)

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