Оператор преобразования против конструктора из заданного типа.Что предпочтительнее? - PullRequest
2 голосов
/ 23 мая 2011

Я определяю типы итераторов для своего контейнера и, конечно, я хочу, чтобы iterator был преобразован в const_iterator.Но я не уверен, что лучше / предпочтительнее:

Оператор преобразования в iterator

class iterator
{
    operator const_iterator();
};

или неявный конструктор в const_iterator

class iterator
{
    // implementation
    friend class iterator; // hard to avoid this
};

class const_iterator
{
    const_iterator(iterator const &);
};

Есть ли какие-либо рекомендации, какой путь лучше?

Ответы [ 3 ]

1 голос
/ 23 мая 2011

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

Во всех остальных случаях вы должны просто написать соответствующий конструктор.

1 голос
/ 23 мая 2011

Как правило:

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

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

Единственным распространенным исключением из этого правила является предоставление преобразования в логический тип, поэтомучто объекты (например, умные указатели) могут использоваться в логических контекстах.

0 голосов
/ 23 мая 2011

В некоторых реализациях iterator наследуется от const_iterator и получает преобразование бесплатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...