Можем ли мы опустить двойные скобки для std::array в C++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

or

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

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

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

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

person bstamour    schedule 13.09.2013    source источник
comment
примечание: это обсуждение относится только к массиву скалярного типа; для массивов агрегатов см. здесь   -  person M.M    schedule 16.05.2016
comment
Возможный дубликат Когда внешние фигурные скобки могут быть опущены в инициализаторе список?   -  person underscore_d    schedule 23.07.2017


Ответы (1)


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

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

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

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

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

person Nawaz    schedule 13.09.2013
comment
Огромное спасибо. С нетерпением жду, когда я смогу его использовать, теперь :-) - person bstamour; 13.09.2013
comment
На странице cppreference указано, что std::array<int, 3> arr{1,2,3}; недействителен в C++11. (может быть неправильно) - person M.M; 16.05.2016
comment
В теме «этот случай», на которую вы ссылаетесь, говорится, как и в cppreference, что std::array <int, 3> arr{1,2,3} является не допустимым синтаксисом в С++ 11, поскольку правила были ослаблены только в С++ 14. - person MicroVirus; 01.02.2018
comment
Это предложение так и не было принято. Вместо этого ранее существовавшие правила удаления фигурных скобок были обобщенный для поддержки этого случая. - person Davis Herring; 13.08.2020