В своем обсуждении Страуструп упоминает, что прямая инициализация, такая как
Sick s2(2.1);
будет рассматривать только конструкторы, отмеченные explicit
, если есть конструкторы explicit
. Это не мой опыт работы с несколькими компиляторами (включая GCC 4.6.1 и MSVC 16 / VS 2010), и я не могу найти такое требование в стандарте (хотя мне было бы интересно, если бы кто-то мог указать на это).
Однако, если в инициализаторах используются целые числа, я думаю, что пример покажет, что хотел бы продемонстрировать Страуструп:
#include <iostream>
struct Sick
{
Sick(double d) { std::cout << "double " << d << "\n"; }
explicit Sick(int i) { std::cout << "int " << i << "\n"; }
};
int main()
{
Sick s1 = 2;
Sick s2(2);
}
Запуск вышеуказанного отобразит:
double 2
int 2
Показывает, что две явно эквивалентные инициализации фактически выбирают разные конструкторы.
(Или, как упоминал в своем вопросе Truncheon - а я пропустил - ключевое слово explicit
должно быть в конструкторе Sick(double d)
).