Почему конструкторы по умолчанию не явны?
Так легко забыть отмечать конструктор "явным": добавление/удаление аргументов, что делает их необязательными и т.д. Единственный надежный способ, который я знаю, - объявить каждый конструктор как явный, а затем удалить это ключевое слово, только если имплицитность требуется дизайн (благодаря стандарту, который допускает это не только для конструкторов с одним аргументом). Но это выглядело бы уродливо.
не подразумеваемые неявные конструкторы открывают использование (ошибочное) неявное преобразование, например. как здесь. это может произойти случайно или может нарушить обратную совместимость.
Итак, почему "явный" не является характеристикой по умолчанию для конструктора, если это приведет к меньшему количеству ошибок?
p.s. да, я прочитал Stroustrup "Дизайн и эволюция С++", просто не помню, говорит ли он что-нибудь о "явном" там
Ответы
Ответ 1
Обратная совместимость в то время, когда был добавлен явный. Язык развивался, и изменение смысла существующих конструкций на развивающемся языке - верный способ заставить ваших пользователей разозлить. Это все еще так, обратная совместимость - это что-то важное в сознании комитета.
Ответ 2
Потому что, когда С++ был задуман, считалось, что никто не будет писать глупый код, и все будут пользоваться теми преимуществами, которые могут иметь приятные неявные преобразования, чтобы избежать необходимости писать приведения везде.
Конечно, это оказалось ложным, и на самом деле есть всевозможные конструкторы. Такой позор.
Ответ 3
Интересная точка зрения. Я хотел бы взять другую сторону и задаться вопросом, почему вы считаете, что вам нужно отметить все ваши конструкторы explicit
, пока не будет доказано обратное?
Честно говоря, я не знаю ответа на ваш вопрос, даже если он есть. Обратная совместимость кажется, что она может быть претендентом на наиболее вероятную причину, но опять же: почему вы хотите предотвратить неявное преобразование?