これを考慮してください:
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 番目のものを選択する必要がありますよね?