Я немного запутался в списках инициализаторов.

Я думаю, что список инициализаторов - это часть C ++:

struct Something { char c0, c1; };

Something something = { 'H', 'W' };

Аналогично с массивами и т.д. И есть что-то связанное (на мой взгляд) с STL (в заголовке <initializer_list>), называется std::initializer_list<T>, что соответствует спискам инициализаторов, например параметры метода и т. д.

std::initializer_list<char> list = { 'H', 'e', 'l', 'l', 'o' };

Теперь мое замешательство:

auto match = { 'H', 'e', 'l', 'l', 'o' };

Когда я смотрю, что такое интерпретация auto (в MSVC 2015), это std::initializer_list<char>.

Итак, мои вопросы:

Где проходит грань между языком C ++ и библиотекой STL?

Есть ли какая-то директива, определяющая, как следует интерпретировать список инициализаторов (в значении C ++)?

Может быть изменена интерпретация, например из std::initializer_list<T> в T[]?

3
user4663214 25 Ноя 2016 в 15:02

2 ответа

Лучший ответ

Ответы частично основаны на ветка MSDN.

Где проходит грань между языком C ++ и библиотекой STL?

Граница между стандартной библиотекой и чистым C ++ немного шумная. Он находится в части библиотеки под названием LSL, Language Support Library. Строка существует в следующем примере: Распределение возвращает std::bad_alloc. Итак, чтобы быть чистым с точки зрения языка C ++, std::bad_alloc можно подавить с помощью прямого выделения через OS API. Аналогично с std :: size_t, std :: nullptr_t и т. Д.

В следующем примере строка, если существует, зашумлена: dynamic_cast выбрасывает std::bad_cast. И аналогичный пример независимости LSL и C ++ - это список инициализаторов.

Есть ли какая-то директива, определяющая, как следует интерпретировать список инициализаторов (в значении C ++)?

Директива как спецификация языка существует, директива как своего рода директива #pragma или что-то еще, что можно просто изменить, - нет.

Может быть изменена интерпретация, например из std :: initializer_list в T []?

В MSVC нет. Наверное, никуда.

0
user4663214 2 Дек 2016 в 20:11

Это совокупная инициализация

struct Something { char c0, c1; };
Something something = { 'H', 'W' };

Где проходит грань между языком C ++ и библиотекой STL?

На самом деле это не разница между языком C ++ и библиотекой STL , поскольку стандартная библиотека написана на C ++ (нет смысла рассматривать их как две отдельные сущности). Главное - различить, какой тип элемента вы инициализируете и какие конструкторы доступны.

Большая часть путаницы возникает из-за того, что предложения и отчеты о дефектах вызвали немало споров о том, как следует интерпретировать инициализацию фигурных скобок (см. статьи Скотта Мейерса , некоторые из них были недавно обсуждалось).

Есть ли какая-то директива, определяющая, как следует интерпретировать список инициализаторов (в значении C ++)?

Единственный правильный способ понять это - научиться распознавать типы, которые вы используете, и понимать стандарт C ++. (в соответствии с используемой версией C ++ и поддержкой компилятора).

1
Marco A. 25 Ноя 2016 в 12:30