Подтвердить что ты не робот

Можем ли мы опустить двойные скобки для std:: array в С++ 14?

Я просматриваю проект стандарта для С++ 14 прямо сейчас, и, возможно, моя легализация немного ржавая, но я не могу найти упоминания о разрешении инициализаций, таких как

std::array<int, 3> arr{1,2,3};

является законным. (EDIT: По-видимому, это законный синтаксис в С++ 11.) В настоящее время в С++ 11 мы должны инициализировать std:: array как

std::array<int, 3> arr{{1,2,3}}; // uniform initialization + aggregate initialization

или

std::array<int, 3> arr = {1,2,3};

Я думал, что где-то я слышал, что они расслабляли правила на С++ 14, поэтому нам не приходилось использовать метод двойной привязки при использовании единой инициализации, но я не могу найти фактическое доказательство.

ПРИМЕЧАНИЕ. Причина, по которой я забочусь об этом, заключается в том, что в настоящее время я разрабатываю тип multi_array и не хочу инициализировать его, как

multi_array<int, 2, 2> matrix = {
  {{ 1, 2 }}, {{ 3, 4 }}
};
4b9b3361

Ответ 1

На самом деле вы также можете написать следующее в С++ 11:

std::array<int, 3> arr{1,2,3};

Это вполне допустимый синтаксис.

Что такое не, разрешенный в С++ 11, хотя это что-то вроде этого случая (см. эту тему, я не хочу напишите здесь еще раз, это длинный пост). Поэтому, если вы спросите, что тогда да, мы можем опустить дополнительные фигурные скобки в С++ 14. Это предложение:

  • Унифицированная инициализация массивов и агрегатных типов классов
  • Вступительное выражение гласит:

    В этом документе предлагается небольшая релаксация правил для выравнивания фигурных скобок от агрегатной инициализации, чтобы сделать инициализацию массивов и агрегатов классов более однородными. Это изменение требуется для поддержки агрегатных классов классов с одним совокупным элементом, которые ведут себя аналогично их аналогам массивов (т.е. std::array).

Надеюсь, что это поможет.