ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΡ‘Π½
Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹
ДСйствия

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ списком (начиная с C++11)

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΈΠ· cppreference.com
 
C++
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° компилятором
АвтономныС ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
Π―Π·Ρ‹ΠΊ
Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°
Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
ВрСбования ΠΊ имСнованию
ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ тСстирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (C++20)
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° языка
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΠΎΠ² (C++20)
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° мСтапрограммирования (C++11)
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° диагностики
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΠ±Ρ‰ΠΈΡ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° строк
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² (C++20)
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° числСнных Π΄Π°Π½Π½Ρ‹Ρ…
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ
РСгулярныС выраТСния (C++11)
АтомарныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (C++11)
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΠΈ (C++11)
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы (C++17)
ВСхничСскиС спСцификации
Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ символов
Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
 
 
Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ
Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€
Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ
ΠŸΡ€ΡΠΌΠ°Ρ инициализация
Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ списком
АгрСгатная инициализация
Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ссылки
ΠŸΡ€ΠΎΠΏΡƒΡΠΊ копирования
БтатичСская инициализация
Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π½ΡƒΠ»Ρ‘ΠΌ
ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½Π°Ρ инициализация
ДинамичСская нСлокальная инициализация
УпорядочСнная динамичСская инициализация
НСупорядочСнная динамичСская инициализация
Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ элСмСнта класса
Бписок ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² элСмСнтов
Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π² классС скобка-ΠΈΠ»ΠΈ-Ρ€Π°Π²Π½ΠΎ
 

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· списка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² скобках.

Бинтаксис

ΠŸΡ€ΡΠΌΠ°Ρ инициализация списком

T Π±ΡŠΠ΅ΠΊΡ‚ { Π°Ρ€Π³1, Π°Ρ€Π³2, ... };

T Π±ΡŠΠ΅ΠΊΡ‚ {.des1 = Π°Ρ€Π³1 , .des2 { Π°Ρ€Π³2 } ... };

(начиная с C++20)
(1)
T { Π°Ρ€Π³1, Π°Ρ€Π³2, ... }

T {.des1 = Π°Ρ€Π³1 , .des2 { Π°Ρ€Π³2 } ... }

(начиная с C++20)
(2)
new T { Π°Ρ€Π³1, Π°Ρ€Π³2, ... }

new T {.des1 = Π°Ρ€Π³1 , .des2 { Π°Ρ€Π³2 } ... }

(начиная с C++20)
(3)
Класс { T элСмСнт { arg1, arg2, ... }; };

Класс { T элСмСнт {.des1 = Π°Ρ€Π³1 , .des2 { Π°Ρ€Π³2 } ... }; };

(начиная с C++20)
(4)
Класс::Класс() : элСмСнт { Π°Ρ€Π³1, Π°Ρ€Π³2, ... } {...

Класс::Класс() : элСмСнт {.des1 = Π°Ρ€Π³1 , .des2 { Π°Ρ€Π³2 } ...} {...

(начиная с C++20)
(5)


Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ списка

T ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ = { Π°Ρ€Π³1, Π°Ρ€Π³2, ... };

T ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ = {.des1 = Π°Ρ€Π³1 , .des2 { Π°Ρ€Π³2 } ... };

(начиная с C++20)
(6)
функция ({ Π°Ρ€Π³1, Π°Ρ€Π³2, ... })

функция ({.des1 = Π°Ρ€Π³1 , .des2 { Π°Ρ€Π³2 } ... })

(начиная с C++20)
(7)
return { Π°Ρ€Π³1, Π°Ρ€Π³2, ... };

return {.des1 = Π°Ρ€Π³1 , .des2 { Π°Ρ€Π³2 } ... };

(начиная с C++20)
(8)
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ [{ Π°Ρ€Π³1, Π°Ρ€Π³2, ... }]

ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ [{.des1 = Π°Ρ€Π³1 , .des2 { Π°Ρ€Π³2 } ... }]

(начиная с C++20)
(9)
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ = { Π°Ρ€Π³1, Π°Ρ€Π³2, ... }

ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ = {.des1 = Π°Ρ€Π³1 , .des2 { Π°Ρ€Π³2 } ... }

(начиная с C++20)
(10)
U ({ Π°Ρ€Π³1, Π°Ρ€Π³2, ... })

U ({.des1 = Π°Ρ€Π³1 , .des2 { Π°Ρ€Π³2 } ... })

(начиная с C++20)
(11)
Класс { T элСмСнт = { Π°Ρ€Π³1, Π°Ρ€Π³2, ... }; };

Класс { T элСмСнт = {.des1 = Π°Ρ€Π³1 , .des2 { Π°Ρ€Π³2 } ... }; };

(начиная с C++20)
(12)

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ списком выполняСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… случаях:

  • прямая инициализация списком (Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ явныС, Ρ‚Π°ΠΊ ΠΈ нСявныС конструкторы)
1) инициализация ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ списка-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, пустого списка Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π·Π°ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½ΠΎΠ³ΠΎ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки, ΠΈΠ»ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… списков ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках)
2) инициализация бСзымянного Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ списка-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках
3) инициализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с динамичСской Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ хранСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ new, Π³Π΄Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ являСтся список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках
4) Π² нСстатичСском ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ элСмСнта Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π·Π½Π°ΠΊ равСнства
5) Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² элСмСнтов конструктора, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках
  • инициализация ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ списка (Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ явныС, Ρ‚Π°ΠΊ ΠΈ нСявныС конструкторы, Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСявныС конструкторы)
6) инициализация ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ списком-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках послС Π·Π½Π°ΠΊΠ° равСнства
7) Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ со списком-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π³Π΄Π΅ инициализация списком ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
8) Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ return со списком-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ Π² качСствС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ выраТСния, Π³Π΄Π΅ инициализация списком ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
9) Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ индСксации с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ operator[], Π³Π΄Π΅ инициализация списком ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°
10) Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ присваивания, Π³Π΄Π΅ инициализация списком ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°
11) Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ привСдСния ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ конструктора, Π³Π΄Π΅ вмСсто Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° конструктора ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ списка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ конструктора (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Ρ‚ΠΈΠΏ U Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ являСтся Ρ‚ΠΈΠΏΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инициализируСтся списком; это Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ конструктора U)
12) Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ нСстатичСского элСмСнта Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π·Π½Π°ΠΊ равСнства

ОбъяснСниС

Π­Ρ„Ρ„Π΅ΠΊΡ‚Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ списком ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° T:

  • Если список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках содСрТит Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ-список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², T Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π°Π³Ρ€Π΅Π³Π°Ρ‚Π½Ρ‹ΠΌ классом. УпорядочСнныС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π² указатСлях Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ-списка-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ упорядочСнных ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π² прямых нСстатичСских элСмСнтах Π΄Π°Π½Π½Ρ‹Ρ… T. ВыполняСтся агрСгатная инициализация.
(начиная с C++20)
  • Если T являСтся Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ классом, Π° список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках содСрТит ΠΎΠ΄ΠΈΠ½ элСмСнт Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ), ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ инициализируСтся ΠΈΠ· этого элСмСнта (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ-списка ΠΈΠ»ΠΈ прямой ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для прямой-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-списком).
  • Π˜Π½Π°Ρ‡Π΅, Ссли T являСтся массивом символов, Π° список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках содСрТит СдинствСнный элСмСнт, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ строковым Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°, массив инициализируСтся ΠΈΠ· строкового Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ.
  • Π˜Π½Π°Ρ‡Π΅, Ссли список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках пуст ΠΈ T являСтся Ρ‚ΠΈΠΏΠΎΠΌ класса с конструктором ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, выполняСтся нициализация Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.
  • Π˜Π½Π°Ρ‡Π΅, Ссли T являСтся спСциализациСй std::initializer_list, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ T the T инициализируСтся, ΠΊΠ°ΠΊ Π·Π°Π΄Π°Π½ΠΎ здСсь.
  • Π˜Π½Π°Ρ‡Π΅ конструкторы T Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π΄Π²Π° этапа:
  • ВсС конструкторы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ std::initializer_list Π² качСствС СдинствСнного Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΠ»ΠΈ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Ссли ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ ΠΈ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΡƒΡ‚Ρ‘ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° std::initializer_list
  • Если ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ этап Π½Π΅ Π΄Π°Π΅Ρ‚ совпадСния, всС конструкторы T ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ для Π½Π°Π±ΠΎΡ€Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², состоящСго ΠΈΠ· элСмСнтов списка-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках, с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ допустимы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ ΡΡƒΠΆΠ°ΡŽΡ‰ΠΈΠ΅ прСобразования Если Π½Π° этом этапС создаётся явный конструктор ΠΊΠ°ΠΊ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠ΅Π΅ соотвСтствиС для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ списка, компиляция Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ошибкой (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ простой ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ явныС конструкторы Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ).
  • Π˜Π½Π°Ρ‡Π΅, Ссли:
    • T это Ρ‚ΠΈΠΏ пСрСчислСния с фиксированным Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ U (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ int, Ссли пСрСчислСниС ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΈ Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π½Π΅ указываСтся Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ), ΠΈ
    • инициализация это прямая инициализация списком, ΠΈ
    • список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ v, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ нСявно прСобразуСтся Π² U, ΠΈ
    • ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· v Π² U Π½Π΅ являСтся ΡΡƒΠΆΠ°ΡŽΡ‰ΠΈΠΌ,
Π·Π°Ρ‚Π΅ΠΌ пСрСчислСниС инициализируСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ прСобразования v Π² U.
(начиная с C++17)
  • Π˜Π½Π°Ρ‡Π΅ (Ссли T Π½Π΅ являСтся Ρ‚ΠΈΠΏΠΎΠΌ класса), Ссли список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ элСмСнт ΠΈ Π»ΠΈΠ±ΠΎ T Π½Π΅ являСтся ссылочным Ρ‚ΠΈΠΏΠΎΠΌ, Π»ΠΈΠ±ΠΎ ссылочным Ρ‚ΠΈΠΏΠΎΠΌ, ссылочный Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈΠ»ΠΈ являСтся Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ классом Ρ‚ΠΈΠΏΠ° элСмСнта, T is инициализируСтся Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ (ΠΏΡ€ΠΈ прямой ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ списком) or ΠΈΠ»ΠΈ инициализируСтся ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ (ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ списка), Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡΡƒΠΆΠ°ΡŽΡ‰ΠΈΠ΅ прСобразования Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹.
  • Π˜Π½Π°Ρ‡Π΅, Ссли T являСтся ссылочным Ρ‚ΠΈΠΏΠΎΠΌ, нСсовмСстимым с Ρ‚ΠΈΠΏΠΎΠΌ элСмСнта:
  • Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° prvalue, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся T, инициализируСтся ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ списка, ΠΈ ссылка привязываСтся ΠΊ этому Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ (это Π½Π΅ удастся, Ссли ссылка являСтся нСконстантной ссылкой lvalue).
(Π΄ΠΎ C++17)
  • гСнСрируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ prvalue. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ prvalue ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ свой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ списка. Π—Π°Ρ‚Π΅ΠΌ prvalue ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прямой ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ссылки (это Π½Π΅ удастся, Ссли ссылка Π½Π΅ являСтся константной ссылкой lvalue). Π’ΠΈΠΏ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° это Ρ‚ΠΈΠΏ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся T, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ T Π½Π΅ являСтся β€œΡΡΡ‹Π»ΠΊΠΎΠΉ Π½Π° массив с нСизвСстной Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ U”, ΠΈ Π² этом случаС Ρ‚ΠΈΠΏ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° это Ρ‚ΠΈΠΏ x Π² объявлСнии U x[] H, Π³Π΄Π΅ H это список ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² (начиная с C++20).
(начиная с C++17)

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ списком std::initializer_list

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° std::initializer_list<E> создаётся ΠΈΠ· списка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠ°ΠΊ Ссли Π±Ρ‹ компилятор сгСнСрировал ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π» (начиная с C++17) prvalue Ρ‚ΠΈΠΏΠ° β€œΠΌΠ°ΡΡΠΈΠ² N const E”, Π³Π΄Π΅ N количСство элСмСнтов Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²; это называСтся Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΌ массивом списка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ².

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ массива инициализируСтся ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта списка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ std::initializer_list<E> создаётся для ссылки Π½Π° этот массив. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΈΠ»ΠΈ функция прСобразования, выбранная для копирования, Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ доступна Π² контСкстС списка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ². Если для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ любого ΠΈΠ· элСмСнтов трСбуСтся ΡΡƒΠΆΠ°ΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π°.

Π Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΉ массив ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ врСмя ΠΆΠΈΠ·Π½ΠΈ, ΠΊΠ°ΠΊ ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ инициализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° std::initializer_list ΠΈΠ· Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ массива ΠΏΡ€ΠΎΠ΄Π»Π΅Π²Π°Π΅Ρ‚ врСмя ΠΆΠΈΠ·Π½ΠΈ массива Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ привязка ссылки ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ.

void f(std::initializer_list<double> il);

void g(float x)
{
   f({1, x, 3});
}

void h()
{
   f({1, 2, 3});
}

struct A { mutable int i; };

void q(std::initializer_list<A>);

void r()
{
    q({A{1}, A{2}, A{3}});
}

// ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Π°Ρ Π²Ρ‹ΡˆΠ΅ инициализация Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° способом, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ эквивалСнтным
// ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π½ΠΈΠΆΠ΅, ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ initializer_list
// с ΠΏΠ°Ρ€ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΈ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ `__b` Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²Ρ‘Ρ‚ Π²Ρ‹Π·ΠΎΠ² `f`.

void g(float x)
{
    const double __a[3] = {double{1}, double{x}, double{3}}; // Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΉ массив
    f(std::initializer_list<double>(__a, __a + 3));
}

void h()
{
    static constexpr double __b[3] =
        {double{1}, double{2}, double{3}}; // Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΉ массив
    f(std::initializer_list<double>(__b, __b + 3));
}

void r()
{
    const A __c[3] = {A{1}, A{2}, A{3}}; // Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΉ массив
    q(std::initializer_list<A>(__c, __c + 3));
}

ВсС Π»ΠΈ Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Π΅ массивы Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ хранятся Π² Π½Π΅ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…) Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ:

bool fun(std::initializer_list<int> il1, std::initializer_list<int> il2)
{
    return il2.begin() == il1.begin() + 1;
}

bool overlapping = fun({1, 2, 3}, {2, 3, 4}); // Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½: Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Π΅
                                              // массивы ΠΌΠΎΠ³ΡƒΡ‚ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
                                              // Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… {1, 2, 3, 4}

Π‘ΡƒΠΆΠ°ΡŽΡ‰ΠΈΠ΅ прСобразования

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ списка ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹Π΅ нСявныС прСобразования запрСщая ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  • ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· Ρ‚ΠΈΠΏΠ° с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой Π² цСлочислСнный Ρ‚ΠΈΠΏ
  • ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· long double Π² double ΠΈΠ»ΠΈ Π² float ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· double Π² float, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ случаСв, ΠΊΠΎΠ³Π΄Π° источник являСтся константным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΈ Π½Π΅ происходит пСрСполнСния
(Π΄ΠΎ C++23)
(начиная с C++23)
  • ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· цСлочислСнного Ρ‚ΠΈΠΏΠ° Π² Ρ‚ΠΈΠΏ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ случаСв, ΠΊΠΎΠ³Π΄Π° источником являСтся константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΌ Ρ‚ΠΈΠΏΠ΅
  • ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· цСлочислСнного Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠ° пСрСчислСния с Π½Π΅Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости Π² цСлочислСнный Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ всС значСния ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π°, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ случаСв, ΠΊΠΎΠ³Π΄Π° источник являСтся константным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΌ Ρ‚ΠΈΠΏΠ΅
    • источник прСдставляСт собой Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ , ΡˆΠΈΡ€ΠΈΠ½Π° w ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ мСньшС ΡˆΠΈΡ€ΠΈΠ½Ρ‹ Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° (ΠΈΠ»ΠΈ, для Ρ‚ΠΈΠΏΠ° пСрСчислСния, Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ Π² основС Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°) ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ всС значСния гипотСтичСского Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ цСлочислСнного Ρ‚ΠΈΠΏΠ° с ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ w ΠΈ с Ρ‚Π΅ΠΌ ΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ исходный Ρ‚ΠΈΠΏ, ΠΈΠ»ΠΈ
    • источник это константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΌ Ρ‚ΠΈΠΏΠ΅
  • ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° указатСля ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠ° указатСля Π½Π° элСмСнт Π² bool

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

КаТдоС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° располагаСтся ΠΏΠ΅Ρ€Π΅Π΄ Π»ΡŽΠ±Ρ‹ΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ слСдуСт Π·Π° Π½ΠΈΠΌ Π² спискС-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-с-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹ΠΌΠΈ-скобками. Π­Ρ‚ΠΎ отличаСтся ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² выраТСния Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (Π΄ΠΎ C++17)ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (начиная с C++17).

Бписок ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках Π½Π΅ являСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ decltype({1,2}) Π½Π΅ Π²Π΅Ρ€Π½ΠΎ. ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠ° шаблона Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ вывСсти Ρ‚ΠΈΠΏ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ списку-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках, поэтому ΠΏΡ€ΠΈ объявлСнии template<class T> void f(T); Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ f({1,2,3}) Π½Π΅ Π²Π΅Ρ€Π½ΠΎ. Однако Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона ΠΌΠΎΠΆΠ½ΠΎ вывСсти, ΠΊΠ°ΠΊ Π² случаС с std::vector<int> v(std::istream_iterator<int>(std::cin), {}), Π³Π΄Π΅ Ρ‚ΠΈΠΏ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° опрСдСляСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ сдСлано для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΠΈΠΏΠ° с использованиСм ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова auto , ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ любой список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках ΠΊΠ°ΠΊ std::initializer_list Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ-списка.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ список-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏΠ°, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° для Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

АгрСгатныС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅/ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡŽΡ‚ΡΡ нСпосрСдствСнно ΠΈΠ· одноэлСмСнтного списка-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Π½ΠΎ Π½Π΅Π°Π³Ρ€Π΅Π³Π°Ρ‚Ρ‹ сначала Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ конструкторы std::initializer_list:

struct X {}; // Π°Π³Ρ€Π΅Π³Π°Ρ‚

struct Q     // Π½Π΅ Π°Π³Ρ€Π΅Π³Π°Ρ‚
{
    Q() = default;
    Q(Q const&) = default;
    Q(std::initializer_list<Q>) {}
};

int main()
{
    X x;
    X x2 = X{x}; // конструктор копирования (Π½Π΅ агрСгатная инициализация)
    
    Q q;
    Q q2 = Q{q}; // конструктор ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ списком (Π½Π΅ конструктор копирования)
}

НСкоторыС компиляторы (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, gcc 10) Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ C++20 Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ указатСля ΠΈΠ»ΠΈ указатСля Π½Π° элСмСнт Π² суТСниС bool.

ΠœΠ°ΠΊΡ€ΠΎΡ ВСстирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ
__cpp_initializer_lists 200806L (C++11) Бписок ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ std::initializer_list

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

#include <iostream>
#include <map>
#include <string>
#include <vector>

struct Foo
{
    std::vector<int> mem = {1, 2, 3}; // инициализация списком нСстатичСского элСмСнта
    std::vector<int> mem2;
    
    Foo() : mem2{-1, -2, -3} {} // инициализация элСмСнта списком Π² конструкторС
};

std::pair<std::string, std::string> f(std::pair<std::string, std::string> p)
{
    return {p.second, p.first}; // инициализация списком Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ return
}

int main()
{
    int n0{};  // инициализация Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ (Π² ноль)
    int n1{1}; // прямая инициализация списком
    
    std::string s1{'a', 'b', 'c', 'd'}; // Π²Ρ‹Π·ΠΎΠ² конструктора ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ списком
    std::string s2{s1, 2, 2};           // Π²Ρ‹Π·ΠΎΠ² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ конструктора
    std::string s3{0x61, 'a'}; // конструктор ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ списком ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅
                               // для (int, char)

    int n2 = {1}; // инициализация ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ списка
    double d = double{1.2}; // инициализация списком prvalue, Π·Π°Ρ‚Π΅ΠΌ инициализация
                            // ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
    auto s4 = std::string{"ΠŸΡ€ΠΈΠ²Π΅Ρ‚ΠœΠΈΡ€"}; // Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π²Ρ‹ΡˆΠ΅, Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹
                                        // Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ начиная с C++17
                     
    std::map<int, std::string> m = // инициализация Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ списком
    {
        {1, "a"},
        {2, {'a', 'b', 'c'}},
        {3, s1}
    };

    std::cout << f({"ΠΏΡ€ΠΈΠ²Π΅Ρ‚", "ΠΌΠΈΡ€"}).first // инициализация списком Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
              << '\n';

    const int (&ar)[2] = {1, 2}; // привязываСт ссылку lvalue ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌΡƒ массиву
    int&& r1 = {1}; // привязываСт ссылку rvalue ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌΡƒ int
//  int& r2 = {2}; // ошибка: Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ rvalue с нСконстантной ссылкой lvalue

//  int bad{1.0}; // ошибка: ΡΡƒΠΆΠ°ΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅
    unsigned char uc1{10}; // ok
//  unsigned char uc2{-1}; // ошибка: ΡΡƒΠΆΠ°ΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅

    Foo f;

    std::cout << n0 << ' ' << n1 << ' ' << n2 << '\n'
              << s1 << ' ' << s2 << ' ' << s3 << '\n';
    for(auto p: m)
        std::cout << p.first << ' ' << p.second << '\n';
    for(auto n: f.mem)
        std::cout << n << ' ';
    for(auto n: f.mem2)
        std::cout << n << ' ';

    [](...){}(d, ar, r1, uc1); // ΠΈΠΌΠ΅Π΅Ρ‚ эффСкт [[maybe_unused]]
}

Π’Ρ‹Π²ΠΎΠ΄:

ΠΌΠΈΡ€
0 1 1
abcd cd aa
1 a
2 abc
3 abcd
1 2 3 -1 -2 -3

ΠžΡ‚Ρ‡Ρ‘Ρ‚Ρ‹ ΠΎ Π΄Π΅Ρ„Π΅ΠΊΡ‚Π°Ρ…

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния повСдСния Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ с ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ силой ΠΊ Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹ΠΌ стандартам C++:

НомСр ΠŸΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½ ПовСдСниС Π² стандартС ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
CWG 1288 C++11 инициализация ссылки одноэлСмСнтным списком-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ-
Π²-Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ…-скобках
всСгда связывала ссылку с Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ
привязываСт ΠΊ этому элСмСнту, Ссли
ΠΎΠ½ дСйствитСлСн
CWG 1290 C++11 врСмя ΠΆΠΈΠ·Π½ΠΈ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ массива ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π½Π΅Π²Π΅Ρ€Π½ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ…
Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²
CWG 1324 C++11 рассматриваСтся ΠΏΠ΅Ρ€Π²ΠΎΠΉ инициализация для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ· {} агрСгатная инициализация
рассматриваСтся ΠΏΠ΅Ρ€Π²ΠΎΠΉ
CWG 1418 C++11 Ρ‚ΠΈΠΏ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ массива Π½Π΅ ΠΈΠΌΠ΅Π» const const Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ
CWG 1467 C++11 Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Π° однотипная инициализация Π°Π³Ρ€Π΅Π³Π°Ρ‚ΠΎΠ² ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ…
массивов; конструкторы ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ списком ΠΈΠΌΠ΅Π»ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚
Π½Π°Π΄ конструкторами копирования для одноэлСмСнтных списков
Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π° однотипная
инициализация; одноэлСмСнтныС
списки ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ
CWG 1494 C++11 ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ списка ссылкой Π½Π° элСмСнт нСсовмСстимого
Ρ‚ΠΈΠΏΠ° Π±Ρ‹Π»ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, являСтся Π»ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ созданным
прямой ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ списком ΠΈΠ»ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
списка
это зависит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
для ссылки
CWG 2137 C++11 конструкторы ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ списком Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ для конструкторов
копирования ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ X списком ΠΈΠ· {X}
сначала Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ Π½Π΅Π°Π³Ρ€Π΅Π³Π°Ρ‚Π½Ρ‹Π΅
списки ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²
CWG 2267 C++11 Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ CWG ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° 1494 Π΄Π°Π»ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ списком Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ
ΠΎΠ½ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
списка ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ссылок
списком
CWG 2374 C++17 прямая инициализация пСрСчислСния списком допускала слишком
ΠΌΠ½ΠΎΠ³ΠΎ исходных Ρ‚ΠΈΠΏΠΎΠ²
ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ
CWG 2627 C++11 ΡƒΠ·ΠΊΠΎΠ΅ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ большСго цСлочислСнного Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ
ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ Π² мСньший цСлочислСнный Ρ‚ΠΈΠΏ, Π½ΠΎ это всё Π΅Ρ‰Ρ‘
ΡΡƒΠΆΠ°ΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅
это Π½Π΅ ΡΡƒΠΆΠ°ΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅
WG Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ C++11 ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· указатСля/указатСля Π½Π° элСмСнт Π² bool
Π½Π΅ суТало
сдСлано ΡΡƒΠΆΠ°ΡŽΡ‰ΠΈΠΌ
WG Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ C++11 Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Π΅ массивы с ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΡΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚
ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ
ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°Ρ‚ΡŒΡΡ

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅