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

БпСцификация динамичСского ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (Π΄ΠΎ C++17)

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

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΠ΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прямо ΠΈΠ»ΠΈ косвСнно ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ функция.

Бинтаксис

throw(список-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²-Ρ‚ΠΈΠΏΠΎΠ² (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ)) (1) (устарСло Π² C++11)
(ΡƒΠ΄Π°Π»Π΅Π½ΠΎ Π² C++17)
1) БпСцификация явного динамичСского ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.
список-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²-Ρ‚ΠΈΠΏΠΎΠ² β€” Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ запятыми список ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²-Ρ‚ΠΈΠΏΠΎΠ², Π·Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚ΠΈΠΏΠ°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, слСдуСт ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅ (...) (начиная с C++11)

Явная спСцификация динамичСского ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ‚ΠΈΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, указатСля Π½Π° Ρ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ссылкС Π½Π° Ρ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ указатСля Π½Π° Ρ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-элСмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Ρ‚ΠΈΠΏΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня объявлСния ΠΈΠ»ΠΈ опрСдСлСния, ΠΈΠ»ΠΈ для Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

void f() throw(int);            // OK: объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
void (*pf)() throw (int);       // OK: объявлСниС указатСля Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
void g(void pfa() throw(int));  // OK: объявлСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° указатСля Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
typedef int (*pf)() throw(int); // Ошибка: объявлСниС typedef

ОбъяснСниС

Если функция объявлСна с Ρ‚ΠΈΠΏΠΎΠΌ T, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² Π΅Ρ‘ спСцификации динамичСского ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, функция ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ этого Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚ Π½Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°.

НСполныС Ρ‚ΠΈΠΏΡ‹, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈΠ»ΠΈ ссылки Π½Π° Π½Π΅ΠΏΠΎΠ»Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΡ‚ cv void*, ΠΈ ссылочныС Ρ‚ΠΈΠΏΡ‹ rvalue (начиная с C++11) Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π² спСцификации ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π’ΠΈΠΏΡ‹ массивов ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ссли ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, cv-квалификация Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня Ρ‚Π°ΠΊΠΆΠ΅ отбрасываСтся. Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (начиная с C++11).

БпСцификация динамичСского ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ‡Π΅ΠΉ Π½Π°Π±ΠΎΡ€ скоррСктированных Ρ‚ΠΈΠΏΠΎΠ² пуст (послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹) (начиная с C++11), Π½Π΅ являСтся Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Ѐункция со спСцификациСй динамичСского ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π΅ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π½Π΅ допускаСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

БпСцификация динамичСского ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅ считаСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ Ρ‚ΠΈΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Если функция Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°, Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² Π΅Ρ‘ спСцификации ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, вызываСтся функция std::unexpected. Ѐункция ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ std::terminate, Π½ΠΎ Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ прСдоставлСнной ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ (Ρ‡Π΅Ρ€Π΅Π· std::set_unexpected), которая ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ std::terminate ΠΈΠ»ΠΈ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Если ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠ΅ std::unexpected, принимаСтся спСцификациСй ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, раскручиваниС стСка продолТаСтся ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ. Если это Π½Π΅ Ρ‚Π°ΠΊ, ΠΈ std::bad_exception Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ спСцификациСй ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, гСнСрируСтся std::bad_exception. Π˜Π½Π°Ρ‡Π΅ вызываСтся std::terminate.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

КаТдая функция f, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pf ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-элСмСнт pmf ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π°Π±ΠΎΡ€ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ состоит ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π±Ρ€ΠΎΡˆΠ΅Π½Ρ‹. Набор всСх Ρ‚ΠΈΠΏΠΎΠ² ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π΄Π°Π½ΠΎ любоС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎΡ‚ Π½Π°Π±ΠΎΡ€ опрСдСляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

1) Если Π² объявлСнии f, pf ΠΈΠ»ΠΈ pmf ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ спСцификация динамичСского ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, которая Π½Π΅ допускаСт всСх ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (Π΄ΠΎ C++11), Π½Π°Π±ΠΎΡ€ состоит ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ², пСрСчислСнных Π² этой спСцификации.
2) Π˜Π½Π°Ρ‡Π΅, Ссли Π² объявлСнии f, pf ΠΈΠ»ΠΈ pmf ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ noexcept(true), Π½Π°Π±ΠΎΡ€ пуст.
(начиная с C++11)
3) Π˜Π½Π°Ρ‡Π΅ Π½Π°Π±ΠΎΡ€ являСтся Π½Π°Π±ΠΎΡ€ΠΎΠΌ всСх Ρ‚ΠΈΠΏΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Для нСявно ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-элСмСнтов (конструкторов, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² присваивания ΠΈ дСструкторов) ΠΈ для наслСдуСмых конструкторов (начиная с C++11) Π½Π°Π±ΠΎΡ€ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ прСдставляСт собой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Π½Π°Π±ΠΎΡ€ΠΎΠ² всСх ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ: конструкторы/ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присваивания/дСструкторы Π½Π΅Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½Ρ‹Ρ… нСстатичСских элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ…, прямыС Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы ΠΈ, Π³Π΄Π΅ это умСстно, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ выраТСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠ°ΠΊ всСгда).

КаТдоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ e ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Набор пуст, Ссли e являСтся основным константным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΈΠ½Π°Ρ‡Π΅ это объСдинСниС Π½Π°Π±ΠΎΡ€ΠΎΠ² ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ всСх нСпосрСдствСнных ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ e (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ выраТСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), Π² сочСтании с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ, зависящим ΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΡ‹ e, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

1) Если e являСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡƒΡΡ‚ΡŒ g ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-элСмСнт, Ρ‚ΠΎΠ³Π΄Π°
  • Ссли Π² объявлСнии g ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ спСцификация динамичСского ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π½Π°Π±ΠΎΡ€ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ g добавляСтся ΠΊ Π½Π°Π±ΠΎΡ€Ρƒ;
  • Ссли Π² объявлСнии g ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ noexcept(true), Π½Π°Π±ΠΎΡ€ пуст;
(начиная с C++11)
  • ΠΈΠ½Π°Ρ‡Π΅ Π½Π°Π±ΠΎΡ€ являСтся Π½Π°Π±ΠΎΡ€ΠΎΠΌ всСх Ρ‚ΠΈΠΏΠΎΠ².
2) Если e нСявно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (это ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½, это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ new ΠΈ функция распрСдСлСния памяти ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π°, ΠΈΠ»ΠΈ это ΠΏΠΎΠ»Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ вызываСтся дСструктор Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°), Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ являСтся Π½Π°Π±ΠΎΡ€ΠΎΠΌ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
3) Если e являСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ throw, Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ прСдставляСт собой ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π΅Π³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ, ΠΈΠ»ΠΈ Π½Π°Π±ΠΎΡ€ всСх Ρ‚ΠΈΠΏΠΎΠ² для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ создания выраТСния throw (Π±Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°).
4) Если e являСтся dynamic_cast ссылкой Π½Π° ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Π½Π°Π±ΠΎΡ€ состоит ΠΈΠ· std::bad_cast.
5) Если e являСтся typeid, ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹ΠΌ ΠΊ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Π½Π° ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Π½Π°Π±ΠΎΡ€ состоит ΠΈΠ· std::bad_typeid.
6) Если e являСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ new с нСконстантным Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ массива, Π° выбранная функция распрСдСлСния ΠΈΠΌΠ΅Π΅Ρ‚ нСпустой Π½Π°Π±ΠΎΡ€ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Π½Π°Π±ΠΎΡ€ состоит ΠΈΠ· std::bad_array_new_length.
(начиная с C++11)
void f() throw(int); // Π½Π°Π±ΠΎΡ€ f() Ρ€Π°Π²Π΅Π½ "int"
void g();            // Π½Π°Π±ΠΎΡ€ g() это Π½Π°Π±ΠΎΡ€ всСх Ρ‚ΠΈΠΏΠΎΠ²

struct A { A(); };                  // Π½Π°Π±ΠΎΡ€ "new A" это Π½Π°Π±ΠΎΡ€ всСх Ρ‚ΠΈΠΏΠΎΠ²
struct B { B() noexcept; };         // Π½Π°Π±ΠΎΡ€ "B()" пуст
struct D() { D() throw (double); }; // Π½Π°Π±ΠΎΡ€ new D это Π½Π°Π±ΠΎΡ€ всСх Ρ‚ΠΈΠΏΠΎΠ²

ВсС нСявно ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-элСмСнты ΠΈ наслСдуСмыС конструкторы (начиная с C++11)ΠΈΠΌΠ΅ΡŽΡ‚ спСцификации ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • Если Π½Π°Π±ΠΎΡ€ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ являСтся Π½Π°Π±ΠΎΡ€ΠΎΠΌ всСх Ρ‚ΠΈΠΏΠΎΠ², нСявная спСцификация ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ всС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (спСцификация ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ считаСтся ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½Π° Π½Π΅Π²Ρ‹Ρ€Π°Π·ΠΈΠΌΠ° Π² ΠΊΠΎΠ΄Π΅ ΠΈ Π²Π΅Π΄Ρ‘Ρ‚ сСбя Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ спСцификация ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ отсутствуСт) (Π΄ΠΎ C++11)это noexcept(false) (начиная с C++11).
  • Π˜Π½Π°Ρ‡Π΅, Ссли Π½Π°Π±ΠΎΡ€ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π½Π΅ пуст, Π² спСцификации нСявного ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ пСрСчислСны всС Ρ‚ΠΈΠΏΡ‹ ΠΈΠ· Π½Π°Π±ΠΎΡ€Π°.
  • Π˜Π½Π°Ρ‡Π΅ нСявная спСцификация ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ throw() (Π΄ΠΎ C++11)noexcept(true) (начиная с C++11).
struct A
{
    A(int = (A(5), 0)) noexcept;
    A(const A&) throw();
    A(A&&) throw();
    ~A() throw(X);
};

struct B
{
    B() throw();
    B(const B&) = default; // спСцификация ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ "noexcept(true)"
    B(B&&, int = (throw Y(), 0)) noexcept;
    ~B() throw(Y);
};

int n = 7;
struct D : public A, public B
{
    // ΠœΠΎΠΆΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ соотвСтствуСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ Ρ‚ΠΈΠΏΠ°)
    // std​::bad_array_new_length, Π½ΠΎ Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ
    // распрСдСлСния памяти
    (void*) new (std::nothrow) int[n];

    // D ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ нСявно ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ элСмСнты:
    // D::D() throw(X, std::bad_array_new_length);
    // D::D(const D&) noexcept(true);
    // D::D(D&&) throw(Y);
    // D::~D() throw(X, Y);
};

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π»ΡƒΡ‡ΡˆΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ C++98, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ. НСсовмСстим с C++17 ΠΈ Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹ΠΌΠΈ вСрсиями.

#include <cstdlib>
#include <exception>
#include <iostream>

class X {};
class Y {};
class Z : public X {};
class W {};

void f() throw(X, Y) 
{
    bool n = false;
    if (n) throw X(); // OK, Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ std::terminate()
    if (n) throw Z(); // Ρ‚Π°ΠΊΠΆΠ΅ OK
    throw W(); // Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ std::unexpected()
}

void handler()
{
    std::cerr << "Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ!\n"; // трСбуСтся сброс
    std::abort();
}

int main()
{
    std::set_unexpected(handler);
    f();
}

Π’Ρ‹Π²ΠΎΠ΄:

Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ!

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

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

НомСр ΠŸΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½ ПовСдСниС Π² стандартС ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
CWG 25 C++98 ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ присваивания ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ указатСлями
Π½Π° элСмСнты с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ спСцификациями ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ
ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ для ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π°
Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ссылок
CWG 973 C++98 спСцификация ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½ΠΎ
Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ указатСля Π½Π°
Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ
CWG 1267 C++11 ссылочныС Ρ‚ΠΈΠΏΡ‹ rvalue Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Π² спСцификациях
ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ
Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹
CWG 1351 C++98
C++11
Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (C++98) ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ элСмСнта ΠΏΠΎ
ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (C++11) ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ Π² нСявной спСцификации
ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ
Π½Π΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ
CWG 1777 C++11 спСцификация throw(T...) Π½Π΅ являСтся спСцификациСй, Π½Π΅
Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅ΠΉ выбрасывания ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π΄Π°ΠΆΠ΅ Ссли T
являСтся пустым ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ
Π½Π΅ выбрасываСт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Ссли ΠΏΠ°ΠΊΠ΅Ρ‚ пуст
CWG 2191 C++98 Π½Π°Π±ΠΎΡ€ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ выраТСния typeid ΠΌΠΎΠΆΠ΅Ρ‚
ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ bad_typeid, Π΄Π°ΠΆΠ΅ Ссли Π΅Π³ΠΎ нСльзя ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ
содСрТит bad_typeid, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ
Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ

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

спСцификатор noexcept(C++11) ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ функция Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ[ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ]