#c #constructor
#c #конструктор
Вопрос:
Я определяю типы итераторов для своего контейнера и, конечно, я хочу, 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 amp;);
};
Есть ли какие-либо рекомендации, какой способ лучше?
Ответ №1:
Как общее правило:
Почти никогда не существует веской причины для предоставления неявных операторов преобразования; всегда предпочтительнее использовать конструкторы преобразования. С неявными операторами преобразования вы редко обнаружите, что они вызываются, когда вы этого не ожидаете, и создают ненужную путаницу.
конструкторы преобразования также являются лучшим способом, поскольку он позволяет придерживаться принципа наименьшего удивления.
Единственным распространенным исключением из этого правила является преобразование в логический тип, чтобы объекты (например, интеллектуальные указатели) можно было использовать в логических контекстах.
Комментарии:
1. AFAIK, как операторы преобразования, так и конструкторы преобразования позволяют компилятору выполнять неявные преобразования. Обрабатываются ли они (операторы и конструкторы) в некоторых обстоятельствах по-разному в соответствии с неявными преобразованиями?
2. Связанный принцип очень общий. Не могли бы вы дать нам более техническое объяснение вашего правила? Особенно с учетом того, что новый синтаксис C предоставляет явные операторы?
Ответ №2:
Оператор приведения следует писать только в том случае, если возможно вернуть желаемый тип без создания нового объекта, или если возвращаемый им тип данных является простым. Например, если это должно было возвращать постоянную ссылку на свойство внутри класса, тогда вы должны записать это как оператор приведения.
Во всех остальных случаях вам следует просто написать соответствующий конструктор.
Комментарии:
1. Я не сомневаюсь, но не могли бы вы объяснить причины? Верно ли это по-прежнему, принимая во внимание, что новый синтаксис C предоставляет явные операторы?
Ответ №3:
Некоторые реализации позволяют iterator
наследовать от const_iterator
и получать преобразование бесплатно.