Как были инициализированы 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.

Другие вопросы по тегам