Есть ли недостаток в маркировке всех конструкторов C ++ явным? - PullRequest
19 голосов
/ 18 апреля 2011

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

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

Ответы [ 3 ]

15 голосов
/ 18 апреля 2011

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

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

9 голосов
/ 18 апреля 2011

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

4 голосов
/ 18 апреля 2011

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

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

...