C ++ 0x добавил явные операторы преобразования, но они всегда должны быть определены как члены класса Source. То же самое относится к оператору присваивания, оно должно быть определено в классе Target.
Когда классы Source и Target необходимого преобразования не зависят друг от друга, ни Source не может определить оператор преобразования, ни Target не может определить конструктор из Source.
Обычно мы получаем это, определяя определенную функцию, такую как
Target ConvertToTarget(Source& v);
Если бы C ++ 0x позволял перегружать оператор преобразования не функциями-членами, мы могли бы, например, определить явное или неявное преобразование между несвязанными типами.
template < typename To, typename From >
operator To(const From& val);
Например, мы могли бы специализировать преобразование из chrono :: time_point в posix_time :: ptime следующим образом
template < class Clock, class Duration>
operator boost::posix_time::ptime(
const boost::chrono::time_point<Clock, Duration>& from)
{
using namespace boost;
typedef chrono::time_point<Clock, Duration> time_point_t;
typedef chrono::nanoseconds duration_t;
typedef duration_t::rep rep_t;
rep_t d = chrono::duration_cast<duration_t>(
from.time_since_epoch()).count();
rep_t sec = d/1000000000;
rep_t nsec = d%1000000000;
return posix_time::from_time_t(0)+
posix_time::seconds(static_cast<long>(sec))+
posix_time::nanoseconds(nsec);
}
И использовать преобразование как любое другое преобразование.
Для более полного описания проблемы см. здесь или в моей Boost.Conversion библиотеке ..
Таким образом, вопрос заключается в следующем: каково обоснование того, чтобы запретить перегрузку оператора преобразований C ++ с функциями, не являющимися членами?