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と のすべてのバージョンではclang、2 番目の呼び出しmsvcに適切な選択ができません。ffこれはコンパイラのバグですか? コードは標準に従ってどのように動作する必要がありますか?

実際、両方の型演算子を for で呼び出すことができますMan&&:

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

しかし、参照修飾のため、暗黙の変換中に 2 番目のものを選択する必要がありますよね?

4

0 に答える 0