Правильн ли этот пример использования «явного» ключевого слова C ++? - PullRequest
7 голосов
/ 19 сентября 2011

В видео GoogleTechTalks на Youtube Бьярн Страуструп рассказывает о готовящемся стандарте C ++ 0x.В видео он упоминает следующий пример:

#include <iostream>

struct Sick
{
    Sick(double d)       { std::cout << d << "\n"; }
    explicit Sick(int i) { std::cout << i << "\n"; }
};


int main()
{
    Sick s1 = 2.1;
    Sick s2(2.1);
}

Он хотел поставить ключевое слово explicit перед Sick(double) вместо Sick(int), чтобы выделить проблемы, связанные с неявными преобразованиями в определенных контекстах

1 Ответ

9 голосов
/ 19 сентября 2011

В своем обсуждении Страуструп упоминает, что прямая инициализация, такая как

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)).

...