Есть ли недостаток в маркировке всех конструкторов C++ явным?
Несколько раз при рефакторинге кода я забывал добавить explicit
ключевое слово при добавлении параметра в конструктор без параметров или при удалении параметров из конструктора с несколькими параметрами. Чтобы предотвратить это, я привык отмечать каждого конструктора explicit
не имеет значения, сколько аргументов у него есть. (За исключением, конечно, тех конструкторов, для которых я действительно хочу неявное преобразование.)
Есть ли у этого недостаток? Спектакль? Время компиляции?
3 ответа
У него нет недостатков. Это будет безопасно в будущем, потому что в C++0x многопараметрические конструкторы участвуют в инициализации с использованием многоэлементных списков инициализаторов и могут быть запрещены для использования в случаях, когда применяются только неявные преобразования с использованием explicit
,
Так что, если вы обнаружите, что многопараметрический конструктор предоставления не логически представляет значение вашего класса, я думаю, что это хорошо, чтобы сделать это explicit
(пример: я бы установил конструктор контейнера (size_t size, T defaultValue)
быть explicit
в то время как конструктор pair
, (T first, U second)
быть установленным неявным).
Я не уверен, но я думаю, что это имеет некоторые неожиданные последствия для конструктора копирования explicit
, Кроме этого, я думаю, ты в порядке.
Там не будет никакой разницы производительности во время выполнения. Разница во времени компиляции, вероятно, будет необнаружима.
Я думаю, что нет никакого вреда в объявлении всех конструкторов с аргументами explicit
за исключением того, что это может выглядеть излишним для тех, у кого более одного аргумента.
Если вы объявляете тип с explicit
конструктор по умолчанию, у вас могут возникнуть проблемы с его использованием с типами коллекций.