Есть ли недостаток в маркировке всех конструкторов C++ явным?

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

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

3 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам