Как были инициализированы const и ссылочные типы перед списками инициализаторов?
В Ivor Horton Beginning Visual C++ 2013 говорится о "инициализирующих списках" в C++, которые:
"С членами класса, которые являются константными или ссылочными типами, у вас нет выбора в отношении того, как они инициализируются. Единственный способ - использовать список инициализаторов членов в конструкторе. Назначение в теле конструктора не будет работать".
Мой Visual Studio 2012 express не компилировал список инициализаторов, поэтому сначала я был сбит с толку, а потом понял, что он не поддерживается в нем.
Мой вопрос заключается в том, как люди инициализировали константные или ссылочные типы перед списками инициализаторов, поскольку в книге сказано, что нет другого способа, кроме использования списков инициализаторов?
2 ответа
Вы путаете два отдельных термина. Это нормально; они названы почти одинаково.
Есть списки инициализаторов (которые я называю "braced-init-lists" именно для того, чтобы избежать этой путаницы). Это {}
последовательности элементов с разделителями, которые используются для инициализации значений. Если элементы одного типа, они могут быть преобразованы в std::intializer_list
, Это было дополнение C++11.
Затем в конструкторе есть список инициализации членов. Вот этот синтаксис:
TypeName(params)
: member1(...)
, member2(...)
{
/*constructor code*/
}
Это было в C++ с C++98/03. Список инициализации членов - это то, как вы инициализируете const
члены и ссылочные типы.
Цитата Хортона говорит о списке инициализации Member, который является функцией C++98.
Это не связано с std::initializer_list
и список инициализации с помощью type name {stuff...};
синтаксис, который на самом деле оба функции C++11.