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

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

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


person Dave Mateer    schedule 18.04.2011    source источник
comment
аналогично: stackoverflow.com/questions/4607047/   -  person    schedule 18.04.2011


Ответы (3)


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

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

person Johannes Schaub - litb    schedule 18.04.2011

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

person James Kanze    schedule 18.04.2011
comment
хороший момент с конструктором копирования, мне интересно, как это влияет на передачу/возврат по значению. - person Matthieu M.; 18.04.2011
comment
Однажды мне это объяснили; мой вывод состоял в том, чтобы просто не делать конструкторы копирования явными и не беспокоиться о деталях. IIRC, да, это означало, что объекты такого типа нельзя было передавать функциям по значению. Но я уже не уверен. - person James Kanze; 18.04.2011
comment
Звучит знакомо, и действительно: bytes.com/topic/c/answers /131511-явный-копирующий-конструктор. CWG 152, исправлено в C++03. - person MSalters; 19.04.2011

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

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

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

person Greg Hewgill    schedule 18.04.2011