Что является объяснением, чтобы не позволить перегружаться оператора преобразований C++ с не являющимися членом функциями

C++ 0x добавил явные операторы преобразования, но они должны всегда определяться как члены Исходного класса. То же относится к оператору присваивания, оно должно быть определено на Целевом классе.

Когда Входные и выходные классы необходимого преобразования независимы друг от друга, ни один, который Источник может определить оператор преобразования, ни один, который Цель может определить конструктора из Источника.

Обычно мы получаем его путем определения определенной функции такой как

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& from)
{
  using namespace boost;
  typedef chrono::time_point time_point_t;
  typedef chrono::nanoseconds duration_t;
  typedef duration_t::rep rep_t;
  rep_t d = chrono::duration_cast(
  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(sec))+
    posix_time::nanoseconds(nsec);
}

И используйте преобразование в качестве любого другого преобразования.

Для большего количества полного описания проблемы посмотрите здесь или на моем Повышении. Библиотека Conversion..

Таким образом, вопрос: Что объяснение не состоит в том, чтобы позволить перегружать оператора преобразований C++ с не являющимися членом функциями?

5
задан Vicente Botet Escriba 1 May 2010 в 20:51
поделиться

2 ответа

С текущими правилами, чтобы определить, можете ли вы конвертировать между двумя классами, вам нужно только посмотреть в двух местах: в определениях источника и цели. Если бы вы могли определить преобразования как функции, не являющиеся членами, функция преобразования могла бы быть где угодно, что могло бы значительно затруднить поиск причины нежелательных или неоднозначных преобразований (в дополнение к тому, что компилятор усложнил бы поиск возможных преобразований во всех случаях, когда преобразование было выполнено). необходимость или возможность, например, перегрузка оператора).

Я не думаю, что предложенный вами шаблон будет очень практичным. Хотя вы можете явно специализировать его для преобразования там, где у вас есть соответствующий особый случай, он все равно перехватит все другие преобразования, вызывающие неоднозначность с любыми ранее существовавшими преобразованиями.

Это, возможно, два потенциальных фактора, препятствующих такой конверсии.

5
ответ дан 14 December 2019 в 13:30
поделиться

Если нет прямой связи между Source и Destination , то я хочу явно идентифицировать преобразования между ними, как с Source sourceFromDestination (const Destination &) функция, и не удивляйтесь случайным неявным преобразованиям.

1
ответ дан 14 December 2019 в 13:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: