Стандарты High Integrity C++ предполагают, что аргументы rvalue для функций могут быть удалены, что предотвращает неявные преобразования.
Я обнаружил, что поведение примитивов и определяемых пользователем типов сильно различается.
struct A { };
struct B { B(const A& ) {} };
template <class T>
void foo(const T&&) = delete; // 1 - deleted rvalue overload. const intentional.
void foo(B) {} // 2
void foo(int) {} // 3
int main(int argc, char* argv[])
{
A a;
foo(a); // This resolves to 2
foo(3.3); // This resolves to 1
foo(2); // This resolves to 3 (as expected).
}
Почему удаленная перегрузка rvalue предотвращает неявное преобразование в int, но не из одного определяемого пользователем типа в другой?