Страницы

Поиск по вопросам

понедельник, 28 января 2019 г.

Зачем нужен 4 конструктор std::bitset, когда есть 3?

Класс std::bitset имеет несколько конструкторов. Один из них (3) имеет вид:
template< class CharT, class Traits, class Alloc > explicit bitset( const std::basic_string& str, typename std::basic_string::size_type pos = 0, typename std::basic_string::size_type n = std::basic_string::npos, CharT zero = CharT('0'), CharT one = CharT('1'));
Другой (4):
template< class CharT > explicit bitset( const CharT* str, typename std::basic_string::size_type n = std::basic_string::npos, CharT zero = CharT('0'), CharT one = CharT('1'));
Зачем нужен конструктор (4), когда есть (3)?
И в частности, зачем использовать CharT* вместо std::basic_string?


Ответ

Я думаю, что это связано с включенной новой возможностью в стандарт C++ в качестве аргумента использовать список инициализации в фигурных скобках.
Дело в том, что все конструкторы класса объявлены со спецификатором функции explicit, чтобы предотвратить неявное преобразование объектов других типов в объекты класса.
В этом случае если вы вызовите конструктор класса с аргументом в фигурных скобках с одним типом, то не будет преобразования объектов списка инициализации в другой тип.
Сравните эти две демонстрационные программы
#include #include
struct A { explicit A( const std::string & ) {} };
int main() { A a( "HEllo" );
return 0; }
Данная программа будет успешно компилироваться. Аргумент конструктора из типа литерала преобразуется в тип объекта класса std::string
Теперь заключите аргумент вызова конструктора в фигурные скобки
#include #include
struct A { explicit A( const std::string & ) {} };
int main() { A a( { "HEllo" } );
return 0; }
Данная программа уже не будет компилироваться.
Поэтому если вы включите еще один конструктор со спецификатором explicit, то программа уже будет компилироваться
#include #include
struct A { explicit A( const std::string & ) {} explicit A( const char * ) {} };
int main() { A a( { "HEllo" } );
return 0; }

Комментариев нет:

Отправить комментарий