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

255
28 февраля 2017, 18:02

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

Answer 1

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).

READ ALSO
Как преобразавать смайлик в код на pgp и javascript

Как преобразавать смайлик в код на pgp и javascript

Искал и ничего не нашёл, да и что именно искать не знаю

238
Не сортируется массив

Не сортируется массив

В чем проблема, почему sort не работает?

203
Превью pdf-документов в IE в окне приложения

Превью pdf-документов в IE в окне приложения

На данный момент не получается реализовать предпросмотр pdf документов в одном окне приложения (SPA проект), без открытия новой вкладкиIE открывает...

228