Зачем нужен 4 конструктор, когда есть 3? [требует правки]

428
31 января 2017, 22:05

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

http://en.cppreference.com/w/cpp/utility/bitset/bitset

Answer 1

Я думаю, что это связано с включенной новой возможностью в стандарт 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;
}
Answer 2

вот тут можно почитать, для чего нужны специализации const char* http://gcc.1065356.n8.nabble.com/Add-const-char-constructors-for-exception-classes-in-lt-stdexcept-gt-td996792.html

READ ALSO
Приложение для обмена сообщениями C++ [требует правки]

Приложение для обмена сообщениями C++ [требует правки]

ЗдравствуйтеНеобходимо написать приложение для обмена сообщениями между пользователями (т

399
Зачем нужны std::logic_error

Зачем нужны std::logic_error

Для чего нужны проверки исключений типа std::logic_error, если в конечной программе такие ошибки отсутствуют, те

422
Создания класса для работы со списком

Создания класса для работы со списком

Задание: создать класс - двухсвязный список, создать конструктор, деструкторМетоды работы с списком: добавление, удаление элементов, сортировка...

431
какой добавить класс (или библиотеку) для функций canvas?

какой добавить класс (или библиотеку) для функций canvas?

не дает в подсказках никаких функций для рисованияМожет нужно добавить что то в библиотеки? или обьявить где то этот класс? radstudio c++builder fmx

488