Есть ли недостаток, чтобы выделить все конструкторы С++ в явном виде?

Несколько раз, когда код рефакторинга, я забыл добавить ключевое слово explicit при добавлении параметра к конструктору без указания параметров или удалению параметров из ранее многопараметрического конструктора. Чтобы предотвратить это, я привык отмечать каждый конструктор explicit, независимо от того, сколько у него аргументов. (За исключением, конечно, тех конструкторов, для которых я действительно хочу неявное преобразование.)

Есть ли недостаток в этом? Представление? Время компиляции?

Ответы

Ответ 1

У него нет недостатков. Это будет безопасно в будущем, потому что в С++ 0x многопараметрические конструкторы участвуют в инициализации с использованием многоэлементных списков инициализаторов и могут быть запрещены к использованию в случаях, когда применяются только неявные преобразования с использованием explicit.

Итак, если вы обнаружите, что многопараметрический конструктор give не логически представляет значение вашего класса, я думаю, что хорошо сделать его explicit (пример: я бы установил конструктор контейнера (size_t size, T defaultValue) be explicit, а конструктор pair, (T first, U second) будет установлен не явным).

Ответ 2

Я не уверен, но я думаю, что для конструктора копирования есть некоторые неожиданные последствия как explicit. Кроме этого, я думаю, что все в порядке.

Ответ 3

Не будет разницы в производительности во время выполнения. Разница во времени компиляции, вероятно, не подлежит определению.

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

Если вы объявляете тип с конструктором по умолчанию explicit, у вас могут возникнуть проблемы с его использованием с типами коллекций.