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

cv (const ΠΈ volatile) ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Ρ‚ΠΈΠΏΠ°

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΈΠ· cppreference.com
 
C++
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° компилятором
АвтономныС ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
Π―Π·Ρ‹ΠΊ
Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°
Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
ВрСбования ΠΊ имСнованию
ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ тСстирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (C++20)
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° языка
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΠΎΠ² (C++20)
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° мСтапрограммирования (C++11)
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° диагностики
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΠ±Ρ‰ΠΈΡ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° строк
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² (C++20)
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° числСнных Π΄Π°Π½Π½Ρ‹Ρ…
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ
РСгулярныС выраТСния (C++11)
АтомарныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (C++11)
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΠΈ (C++11)
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы (C++17)
ВСхничСскиС спСцификации
Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ символов
Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
 
Π―Π·Ρ‹ΠΊ Π‘++
ΠžΠ±Ρ‰ΠΈΠ΅ Ρ‚Π΅ΠΌΡ‹
Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ
ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ условного выполнСния
if
ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ (Ρ†ΠΈΠΊΠ»Ρ‹)
ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°
Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ
ОбъявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ inline
Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ динамичСских ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (Π΄ΠΎ C++17*)
Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ noexcept (C++11)
Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ
ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΡ‘Π½
Π’ΠΈΠΏΡ‹
Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹
decltype (C++11)
auto (C++11)
alignas (C++11)
Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ хранСния
Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ
ВыраТСния
ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ прСдставлСния
Π›ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹
ЛогичСскиС - ЦСлочислСнныС - Π‘ ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой
Π‘ΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ - Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ - nullptr (C++11)
ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌΡ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ (C++11)
Π£Ρ‚ΠΈΠ»ΠΈΡ‚Ρ‹
Атрибуты (C++11)
Types
ОбъявлСниС typedef
ОбъявлСниС псСвдонима Ρ‚ΠΈΠΏΠ° (C++11)
Casts
НСявныС прСобразования - Π―Π²Π½Ρ‹Π΅ прСобразования
static_cast - dynamic_cast
const_cast - reinterpret_cast
Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти
ΠšΠ»Π°ΡΡΡ‹
Бвойства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ класса
explicit (C++11)
static
Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-элСмСнты
Π¨Π°Π±Π»ΠΎΠ½Ρ‹
Π Π°Π·Π½ΠΎΠ΅
 
ОбьявлСния
ΠžΠ±Π·ΠΎΡ€
синтаксис объявлСния
ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ-спСцификаторов-объявлСния
объявлСниС
Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹
спСцификатор Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ virtual
спСцификатор Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ explicit
(C++11)
(C++20)
спСцификатор класса памяти
(C++11)
(C++11)
(C++11)
спСцификатор ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°
Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (C++11)
ОбъявлСния
ссылка
ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ
массив
Block declarations
простоС объявлСниС
→ объявлСниС структурных привязок (C++17)
объявлСниС псСвдонимов(C++11)
объявлСниС псСвдонимов пространств ΠΈΠΌΡ‘Π½
using-declaration
Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° using
объявлСниС static_assert (C++11)
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ asm
объявлСниС Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ³ΠΎ enum(C++11)
Π”Ρ€ΡƒΠ³ΠΈΠ΅ объявлСния
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ пространств ΠΈΠΌΡ‘Π½
объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
объявлСниС шаблона класса
объявлСниС шаблона Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
явноС инстанцированиС шаблона(C++11)
явная спСциализация шаблона
спСцификация связывания
объявлСниС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° (C++11)
пустоС объявлСниС
 

ΠŸΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² любом спСцификаторС Ρ‚ΠΈΠΏΠ°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ-спСцификаторов-объявлСния Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ объявлСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π²ΠΎΠ»Π°Ρ‚ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ объявляСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

  • const - опрСдСляСт, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ являСтся константой.
  • volatile - опрСдСляСт, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ являСтся volatile.

ОбъяснСниС

Π›ΡŽΠ±ΠΎΠΉ Ρ‚ΠΈΠΏ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΉ), ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ ссылочного Ρ‚ΠΈΠΏΠ° это Ρ‚ΠΈΠΏ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ…, Π½ΠΎ связанных Ρ‚ΠΈΠΏΠΎΠ²:

  • cv-нСквалифицированная вСрсия.
  • const-квалифицированная вСрсия.
  • volatile-квалифицированная вСрсия.
  • const-volatile-квалифицированная вСрсия.

Π­Ρ‚ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ‚ΠΈΠΏΠ° Π² ΠΎΠ΄Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ трСбования ΠΊ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΡŽ.

БчитаСтся, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ массивов ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Ρƒ ΠΆΠ΅ cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎ ΠΈ Ρ‚ΠΈΠΏΡ‹ ΠΈΡ… элСмСнтов.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ const ΠΈ volatile

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ-спСцификаторов-объявлСния ΠΈΠ»ΠΈ Ρ‡Π°ΡΡ‚ΡŒΡŽ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€Π° Π² объявлСнии ΠΈΠ»ΠΈ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°-Ρ‚ΠΈΠΏΠ° Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ new) ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π²ΠΎΠ»Π°Ρ‚ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ это
  • ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся константным, ΠΈΠ»ΠΈ
  • Π½Π΅ mutable ΠΏΠΎΠ΄ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ константного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.
Π’Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ нСльзя ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ: ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ являСтся ошибкой Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции, Π° ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это косвСнно (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡƒΡ‚Ρ‘ΠΌ измСнСния константного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· ссылку ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° нСконстантный Ρ‚ΠΈΠΏ) ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ повСдСнию.
  • volatile ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ это
  • ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся volatile-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ,
  • ΠΏΠΎΠ΄ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ volatile ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈΠ»ΠΈ
  • ΠΏΠΎΠ΄ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ mutable const-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.
ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ доступ (опСрация чтСния ΠΈΠ»ΠΈ записи, Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-элСмСнта ΠΈ Ρ‚.Π΄.) осущСствляСмый Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ glvalue volatile-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, рассматриваСтся ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΉ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт для Ρ†Π΅Π»Π΅ΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ (Ρ‚.Π΅., Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° выполнСния, volatile доступ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΈΠ»ΠΈ пСрСупорядочСн с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌ эффСктом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ упорядочСн Π΄ΠΎ упорядочСн послС volatile доступа. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ volatile ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌΠΈ для связывания с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ сигнала, Π½ΠΎ Π½Π΅ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ выполнСния, смотритС std::memory_order). Π›ΡŽΠ±Π°Ρ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ volatile ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Ρ‡Π΅Ρ€Π΅Π· glvalue Π½Π΅ volatile Ρ‚ΠΈΠΏΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π΅Ρ€Π΅Π· ссылку ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅ volatile Ρ‚ΠΈΠΏ) ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ повСдСнию.
  • ΠžΠ±ΡŠΠ΅ΠΊΡ‚ const volatile это
  • ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ const-volatile-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ,
  • Π½Π΅ mutable ΠΏΠΎΠ΄ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ const volatile ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°,
  • константный ΠΏΠΎΠ΄ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ volatile ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ
  • Π½Π΅ mutable volatile ΠΏΠΎΠ΄ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ константного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.
Π’Π΅Π΄Ρ‘Ρ‚ сСбя ΠΊΠ°ΠΊ константный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ ΠΊΠ°ΠΊ volatile ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ (const ΠΈ volatile) ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π° Π² любой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ². НапримСр, const const ΠΈ volatile const volatile Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ допустимыми ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ².

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ mutable

  • mutable - Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ элСмСнта класса, объявлСнного mutable, Π΄Π°ΠΆΠ΅ Ссли содСрТащий Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ объявлСн константным (Ρ‚.Π΅. элСмСнт класса являСтся mutable).

ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Π² объявлСнии нСстатичСских элСмСнтов класса нСссылочного нСконстантного Ρ‚ΠΈΠΏΠ°:

class X
{
    mutable const int* p; // OK
    mutable int* const q; // Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ
    mutable int&       r; // Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ
};

mutable ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ элСмСнт Π½Π΅ влияСт Π½Π° Π²ΠΈΠ΄ΠΈΠΌΠΎΠ΅ ΠΈΠ·Π²Π½Π΅ состояниС класса (Ρ‡Ρ‚ΠΎ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ², кэшСй, ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… вычислСний ΠΈ инструмСнтов доступа).

class ThreadsafeCounter
{
    mutable std::mutex m; // "ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ M&M": mutable ΠΈ mutex ΠΈΠ΄ΡƒΡ‚ вмСстС
    int data = 0;
public:
    int get() const
    {
        std::lock_guard<std::mutex> lk(m);
        return data;
    }
    
    void inc()
    {
        std::lock_guard<std::mutex> lk(m);
        ++data;
    }
};

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ

БущСствуСт частичноС упорядочиваниС cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. О Ρ‚ΠΈΠΏΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ, Ρ‡Π΅ΠΌ:

  • Π½Π΅ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ < const
  • Π½Π΅ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ < volatile
  • Π½Π΅ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ < const volatile
  • const < const volatile
  • volatile < const volatile

Бсылки ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ нСявно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π² ссылки ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π±ΠΎΠ»Π΅Π΅ cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, смотритС ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ прСобразования для получСния ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ссылку ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π² ссылку ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΌΠ΅Π½Π΅Π΅ cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ const_cast.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова

const, volatile, mutable

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

ΠšΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ const, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈ объявлСнии нСлокальной Π½Π΅ volatile Π½Π΅ шаблонной (начиная с C++14)Π½Π΅ inline (начиная с C++17) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, которая Π½Π΅ объявлСна ΠΊΠ°ΠΊ extern, Π΄Π°Ρ‘Ρ‚ Π΅ΠΉ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ связываниС. Π­Ρ‚ΠΎ отличаСтся ΠΎΡ‚ C, Π³Π΄Π΅ константныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ области видимости Ρ„Π°ΠΉΠ»Π° ΠΈΠΌΠ΅ΡŽΡ‚ внСшнСС связываниС.

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° языка C++ рассматриваСт mutable ΠΊΠ°ΠΊ спСцификатор-класса-хранСния, Π° Π½Π΅ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΈΠΏΠ°, Π½ΠΎ это Π½Π΅ влияСт Π½Π° класс хранСния ΠΈΠ»ΠΈ связываниС.

НСкоторыС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования volatile устарСли:

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

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

int main()
{
    int n1 = 0;          // нСконстантный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
    const int n2 = 0;    // константный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
    int const n3 = 0;    // константный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Ρ‚ΠΎ ΠΆΠ΅ Ρ‡Ρ‚ΠΎ ΠΈ n2)
    volatile int n4 = 0; // volatile ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
    
    const struct
    {
        int n1;
        mutable int n2;
    } x = {0, 0};        // константный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с mutable элСмСнтом

    n1 = 1;   // ok, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
//  n2 = 2;   // ошибка: Π½Π΅ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
    n4 = 3;   // ok, рассматриваСтся ΠΊΠ°ΠΊ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт
//  x.n1 = 4; // ошибка: элСмСнт константного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° являСтся константным
    x.n2 = 4; // ok, mutable элСмСнт константного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ являСтся константой

    const int& r1 = n1; // ссылка Π½Π° константу, ΠΏΡ€ΠΈΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ ΠΊ нСконстантному ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ
//  r1 = 2; // ошибка: ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ссылку Π½Π° const
    const_cast<int&>(r1) = 2; // ok, измСняСт нСконстантный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ n1

    const int& r2 = n2; // ссылка Π½Π° константу, ΠΏΡ€ΠΈΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ ΠΊ константному ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ
//  r2 = 2; // ошибка: ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ссылку Π½Π° const
//  const_cast<int&>(r2) = 2; // ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ: ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ
//  константный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ n2

    [](...){}(n3, n4, x, r2); // смотритС Ρ‚Π°ΠΊΠΆΠ΅: [[maybe_unused]]

    std::system("g++ -O3 -Wa,-adhln ./main.cpp"); // ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ asm Π² систСмах POSIX
}

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄:

# Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, созданный Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ x86_64
# (гСнСрируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ способствуСт Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹ΠΌ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌ эффСктам)
main:
    movl    $0, -4(%rsp) # volatile int n4 = 0;
    movl    $3, -4(%rsp) # n4 = 3;
    xorl    %eax, %eax   # Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 (нСявно)
    ret

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

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

НомСр ΠŸΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½ ПовСдСниС Π² стандартС ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
CWG 1428 C++98 ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ константного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Ρ‹Π»ΠΎ основано Π½Π° объявлСнии основано Π½Π° Ρ‚ΠΈΠΏΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
CWG 1528 C++98 Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ количСство Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°
Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²
Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ
cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°
CWG 1799 C++98 mutable ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½ ΠΊ элСмСнтам Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅
ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΌ ΠΊΠ°ΠΊ const, Π½ΠΎ Ρ‚ΠΈΠΏΡ‹ элСмСнтов ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ
ΠΈΠΌΠ΅Ρ‚ΡŒ const-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ
Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ mutable ΠΊ элСмСнтам
Π΄Π°Π½Π½Ρ‹Ρ… const-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²

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

ДокумСнтация C ΠΏΠΎ ΠšΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ const
ДокумСнтация C ΠΏΠΎ ΠšΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ volatile