1

考虑一下

struct Man
{
  operator int const&  () const&  { return           m_ban ; }
  operator int      && ()      && { return std::move(m_ban); }
  int m_ban;
};

void ff(int const& ) { std::cerr << "==== void ff(int const& )" << std::endl; }
void ff(int      &&) { std::cerr << "==== void ff(int      &&)" << std::endl; }

然后:

  Man man;
  ff(static_cast<Man const& >(man));
  ff(static_cast<Man      &&>(man));

这完全适用于gcc-8.3.0, 但gcc-9.3.0所有版本的clangandmsvc都无法ff为第二次调用选择正确的。这是编译器错误吗?代码应该如何按照标准表现?

实际上,两种类型的运算符都可以调用Man&&

  static_cast<Man&&>(man).operator int const& ();
  static_cast<Man&&>(man).operator int      &&();

但是由于 ref-qualification,第二个应该在隐式转换期间选择,对吧?

4

0 回答 0