Стандарты программирования на С++


Обсуждение


Неявные преобразования типов имеют две основные проблемы.

  • Они могут проявиться в самых неожиданных местах.

  • Они не всегда хорошо согласуются с остальными частями языка программирования.

Неявно преобразующие конструкторы (конструкторы, которые могут быть вызваны с одним аргументом и не объявлены как explicit) плохо взаимодействуют с перегрузкой и приводят к созданию невидимых временных объектов. Преобразования типов, определенные как функции-члены вида operator T (где T — тип), ничуть не лучше — они плохо взаимодействуют с неявными конструкторами и позволяют без ошибок скомпилировать разнообразные бессмысленные фрагменты кода (примеров чего несть числа — см. приведенные в конце рекомендации ссылки; мы приведем здесь только пару из них).

В C++ последовательность преобразований типов может включать не более одного пользовательского преобразования. Однако когда в эту последовательность добавляются встроенные преобразования, ситуация может оказаться предельно запутанной. Решение здесь простое и состоит в следующем.

  • По умолчанию используйте explicit в конструкторах с одним аргументом (см. рекомендацию 54):

    class Widget { // ... explicit Widget(unsigned int widgetizationFactor); explicit Widget(const char* name, const Widget* other = 0); };

  • Используйте для преобразований типов именованные функции, а не соответствующие операторы:

    class String { // ... const char* as_char_pointer() const; // В традициях c_str };

См. также обсуждение копирующих конструкторов, объявленных как explicit, в рекомендации 54.




Начало  Назад  Вперед



Книжный магазин