考虑一下:
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
andmsvc
都无法ff
为第二次调用选择正确的。这是编译器错误吗?代码应该如何按照标准表现?
实际上,两种类型的运算符都可以调用Man&&
:
static_cast<Man&&>(man).operator int const& ();
static_cast<Man&&>(man).operator int &&();
但是由于 ref-qualification,第二个应该在隐式转换期间选择,对吧?