C++ 多重转换运算符

C++ multiple conversion operators

我定义了一个class,如下所示,有两个成员变量和两个转换运算符(operator float 和operator chrono::microseconds)。但是下面的代码只有在我注释掉 float 运算符时才有效。否则,它会抛出错误(无法转换类型)。我不明白为什么?

#include <iostream>
#include <chrono>

using namespace std::chrono_literals;

class Peak {
public:
  Peak (std::chrono::microseconds t, float magnitude)
  : t_(t),
    magnitude_(magnitude)
  {
  };

  std::chrono::microseconds get_t() { return t_; }
  //have to comment this out or I get an error
  operator float() { return magnitude_; }
  operator std::chrono::microseconds() {
      return t_;
  }
private:
  std::chrono::microseconds t_{2us};
  float magnitude_;
};

int main()
{
  Peak a{3us, 100};
  std::cout
    << "t is "
    << static_cast<std::chrono::microseconds>(a).count();
}

看起来像是 GCC 7.3 及更早版本中的编译器错误。解决方法似乎是使用 -std=c++17 标志进行构建。或者,使 float 转换运算符 explicit 也可以修复它:

explicit operator float() const { return magnitude_; }

(顺便标记一下这些 const 总是个好主意。)

更新:

实际上,只需将这些运算符设置为 const 似乎就可以解决问题,而无需将 float 设置为 explicit,也无需使用 -std=c++17 构建。