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