Зачем нужен 4 конструктор, когда есть 3?
http://en.cppreference.com/w/cpp/utility/bitset/bitset
Я думаю, что это связано с включенной новой возможностью в стандарт C++ в качестве аргумента использовать список инициализации в фигурных скобках.
Дело в том, что все конструкторы класса объявлены со спецификатором функции explicit, чтобы предотвратить неявное преобразование объектов других типов в объекты класса.
В этом случае если вы вызовите конструктор класса с аргументом в фигурных скобках с одним типом, то не будет преобразования объектов списка инициализации в другой тип.
Сравните эти две демонстрационные программы
#include <iostream>
#include <string>
struct A
{
explicit A( const std::string & ) {}
};
int main()
{
A a( "HEllo" );
return 0;
}
Данная программа будет успешно компилироваться. Аргумент конструктора из типа литерала преобразуется в тип объекта класса std::string.
Теперь заключите аргумент вызова конструктора в фигурные скобки
#include <iostream>
#include <string>
struct A
{
explicit A( const std::string & ) {}
};
int main()
{
A a( { "HEllo" } );
return 0;
}
Данная программа уже не будет компилироваться.
Поэтому если вы включите еще один конструктор со спецификатором explicit, то программа уже будет компилироваться
#include <iostream>
#include <string>
struct A
{
explicit A( const std::string & ) {}
explicit A( const char * ) {}
};
int main()
{
A a( { "HEllo" } );
return 0;
}
вот тут можно почитать, для чего нужны специализации const char* http://gcc.1065356.n8.nabble.com/Add-const-char-constructors-for-exception-classes-in-lt-stdexcept-gt-td996792.html
Продвижение своими сайтами как стратегия роста и независимости