The issue is that the non-member operator<
for std::vector
is a function template:
template< class T, class Alloc >
bool operator<( const vector<T,Alloc>& lhs,
const vector<T,Alloc>& rhs );
Implicit conversions are not considered when doing template type deduction here, [temp.arg.explicit] emphasis on if:
Implicit conversions (Clause 4) will be performed on a function argument to convert it to the type of the
corresponding function parameter if the parameter type contains no template-parameters that participate
in template argument deduction.
But in this case, the parameter type does participate in deduction. That's why it can't be found. Had we written our own non-template operator<
:
bool operator<(const std::vector<int>& lhs, const std::vector<int>& rhs)
{
return true;
}
Your code would work as expected. To use the generic one though, you will have to explicitly pull out the reference:
std::cout << (refa.get() < refb.get()) << '
';
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…