Страницы

Поиск по вопросам

понедельник, 15 октября 2018 г.

На что способен explicit?

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


Ответ

explicit для операторов преобразования нужен по той же причине, что и для конструкторов. Требование от программиста явно указывать тип, чтобы избежать неожиданного поведения кода при неявном приведении типов.
Самый популярный пример это operator bool. До c++11 отсутствие возможности задавать explicit для оператора преобразования в тип требовало городить довольно неочевидные схемы для реализации идиомы Safe Bool. Т.е. использование объекта нашего типа в контексте, когда требуется приведение в булев тип, например внутри if или while. В частности можно обратить внимание на std::ios::operator bool. По ссылке как раз хорошо видно различие между c++98 и c++11.
То, что раньше нельзя было задавать "явность" для оператора преобразования по сути - досадная недоработка, т.к. оператор преобразования и конструктор с одним параметром (для которого как раз актуален explicit) по сути предназначены для одного и того же. Разница лишь в том с какой стороны смотреть. Если мы создаём класс N, то конструктор вида N(O o) будет осуществлять преобразование типа O в тип N. Для преобразование в обратную сторону нужен либо конструктор вида O(N n) (но это порой невозможно, т.к. тип O может быть закрыт или вовсе не быть классом), либо operator O(N n)

Комментариев нет:

Отправить комментарий