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

НСстатичСскиС элСмСнты Π΄Π°Π½Π½Ρ‹Ρ…

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

НСстатичСскиС элСмСнты Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² спСцификации элСмСнта класса.

class S
{
    int n;                // нСстатичСский элСмСнт Π΄Π°Π½Π½Ρ‹Ρ…
    int& r;               // нСстатичСский элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… ссылочного Ρ‚ΠΈΠΏΠ°
    int a[2] = {1, 2};    // нСстатичСский элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ элСмСнта
                          // ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (C++11)
    std::string s, *ps;   // Π΄Π²Π° нСстатичСских элСмСнта Π΄Π°Π½Π½Ρ‹Ρ…
    struct NestedS {
        std::string s;
    } d5;                 // нСстатичСский элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°
    char bit : 2;         // Π΄Π²ΡƒΡ…Π±ΠΈΡ‚Π½ΠΎΠ΅ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅
};

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Π»ΡŽΠ±Ρ‹Π΅ простыС объявлСния, ΠΊΡ€ΠΎΠΌΠ΅

  • спСцификаторы классов памяти extern ΠΈ register Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ;
  • спСцификатор класса памяти thread_local Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½ (Π½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½ для статичСских элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ…);
(начиная с C++11)
  • Π½Π΅ΠΏΠΎΠ»Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, Ρ‚ΠΈΠΏΡ‹ абстрактных классов ΠΈ ΠΈΡ… массивы Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ: Π² частности, класс C Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСстатичСский элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° C, хотя ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСстатичСский элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° C& (ссылка Π½Π° C) ΠΈΠ»ΠΈ C* (ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° C);
  • нСстатичСский элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ имя, Ρ‡Ρ‚ΠΎ ΠΈ имя класса, Ссли присутствуСт хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ конструктор;
(начиная с C++11)

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ объявлСния Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ.

Компоновка

Когда создаётся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ класса C, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ нСстатичСский элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ссылочного Ρ‚ΠΈΠΏΠ° распрСдСляСтся Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ части ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ прСдставлСния C. Π—Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ Π»ΠΈ ссылочныС элСмСнты ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ, опрСдСляСтся Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Π½ΠΎ ΠΈΡ… Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ хранСния такая ΠΆΠ΅, ΠΊΠ°ΠΊ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, элСмСнтами ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ.

Для Ρ‚ΠΈΠΏΠΎΠ² классов, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΡ‚ union, элСмСнты Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (начиная с C++20), Π½Π΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ спСцификатором доступа (Π΄ΠΎ C++11), с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ доступом ΠΊ элСмСнту (начиная с C++11), всСгда Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ элСмСнты, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ·ΠΆΠ΅, ΠΈΠΌΠ΅Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ высокиС адрСса Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹, Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ спСцификатором доступа (Π΄ΠΎ C++11), с Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ доступа (начиная с C++11) Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π² Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ порядкС (компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… вмСстС). ВрСбования ΠΊ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΡŽ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ заполнСния ΠΌΠ΅ΠΆΠ΄Ρƒ элСмСнтами ΠΈΠ»ΠΈ послС послСднСго элСмСнта класса.

(Π΄ΠΎ C++23)

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

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

Бтандартная ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ°

Класс считаСтся стандартным ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ свойства, описанныС Π½ΠΈΠΆΠ΅, Ρ‚ΠΎΠ³Π΄Π° ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ являСтся классом POD.

(Π΄ΠΎ C++11)

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

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

ΠžΠ±Ρ‰Π°Ρ Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄Π²ΡƒΡ… стандартных классовых Ρ‚ΠΈΠΏΠΎΠ², Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ объСдинСниСм, прСдставляСт собой ΡΠ°ΠΌΡƒΡŽ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ нСстатичСских элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ Π² порядкС объявлСния, начиная с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· классов, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ

  • Π»ΠΈΠ±ΠΎ ΠΎΠ±Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ [[no_unique_address]], Π»ΠΈΠ±ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ…,
(начиная с C++20)
  • ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ совмСстимыС ΠΏΠΎ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΡŽ Ρ‚ΠΈΠΏΡ‹,
  • ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ трСбования ΠΊ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΡŽ, ΠΈ
  • Π»ΠΈΠ±ΠΎ ΠΎΠ±Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ полями ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ ΡˆΠΈΡ€ΠΈΠ½Ρ‹, Π»ΠΈΠ±ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ являСтся Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎΠ»Π΅ΠΌ.
struct A { int a; char b; };
struct B { const int b1; volatile char b2; }; 
// общая Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ A ΠΈ B это A.a, A.b ΠΈ B.b1, B.b2
struct C { int c; unsigned : 0; char b; };
// общая Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ A ΠΈ C это A.a ΠΈ C.c
struct D { int d; char b : 4; };
// общая Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ A ΠΈ D это A.a ΠΈ D.d
struct E { unsigned int e; char b; };
// общая Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ A ΠΈ E пуста

Π”Π²Π° Ρ‚ΠΈΠΏΠ° класса Π½Π΅ объСдинСния со стандартной ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ совмСстимыми ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅, Ссли ΠΎΠ½ΠΈ относятся ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ, игнорируя cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ Π΅ΡΡ‚ΡŒ, совмСстимы ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅ пСрСчислСний (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ пСрСчислСния с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ), ΠΈΠ»ΠΈ Ссли ΠΈΡ… общая Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ состоит ΠΈΠ· нСстатичСских элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ (Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, A ΠΈ B совмСстимы ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅)

Π”Π²Π° объСдинСния со стандартной ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ совмСстимыми-ΠΏΠΎ-ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅, Ссли ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство нСстатичСских элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ…, Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ нСстатичСскиС элСмСнты Π΄Π°Π½Π½Ρ‹Ρ… (Π² любом порядкС) ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏΡ‹, совмСстимыС с ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΠΊ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ особыми свойствами:

  • Π’ объСдинСнии стандартной ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ с Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ элСмСнтом Ρ‚ΠΈΠΏΠ° класса Π½Π΅ объСдинСния T1, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ нСстатичСский элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… m Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ элСмСнта объСдинСния, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ Ρ‚ΠΈΠΏΠΎΠΌ класса объСдинСния T2 ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ m являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ‰Π΅ΠΉ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ T1 ΠΈ T2 (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ volatile элСмСнта Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ volatile glvalue Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ).
  • Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° класса стандартной ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ reinterpret_cast Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ нСстатичСский элСмСнт Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎΠ»Π΅ΠΌ (Ссли ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ нСстатичСскиС элСмСнты Π΄Π°Π½Π½Ρ‹Ρ…), ΠΈΠ»ΠΈ Π½Π° любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса (Ссли Π΅ΡΡ‚ΡŒ), ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ допускаСтся ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом Π΄Π°Π½Π½Ρ‹Ρ… стандартного Ρ‚ΠΈΠΏΠ° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° строгого псСвдонима ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ привСдСния.
  • ΠœΠ°ΠΊΡ€ΠΎΡ offsetof ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для опрСдСлСния смСщСния любого элСмСнта ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° класса стандартной ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ элСмСнта

НСстатичСскиС элСмСнты Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΄Π²ΡƒΡ… способов:

1) Π’ спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² элСмСнтов конструктора.
struct S
{
    int n;
    std::string s;
    S() : n(7) {} // прямая инициализация n, инициализация ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ s

};
2) Π§Π΅Ρ€Π΅Π· ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ элСмСнта ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹ΠΌΠΈ скобками ΠΈΠ»ΠΈ Ρ€Π°Π²Π΅Π½ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΌΡƒ Π² объявлСниС элСмСнта, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ссли этот элСмСнт ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½ Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² элСмСнтов конструктора.
struct S
{
    int n = 7;
    std::string s{'a', 'b', 'c'};
    S() {} // ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ элСмСнта ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΏΠΈΠ΅ΠΉ n,
        // ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ списком s

};

Если элСмСнт ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ элСмСнта ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ появляСтся Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ элСмСнтов Π² конструкторС, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ элСмСнта ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ игнорируСтся для этого конструктора.

#include <iostream>

int x = 0;
struct S
{
    int n = ++x;
    S() { }                 // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ элСмСнта ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
    S(int arg) : n(arg) { } // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ элСмСнта
};

int main()
{
    std::cout << x << '\n'; // ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ 0
    S s1;                   // ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½
    std::cout << x << '\n'; // ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ 1
    S s2(7);                // ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½
    std::cout << x << '\n'; // ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ 1
}

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ элСмСнтов ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ для элСмСнтов Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ.

(Π΄ΠΎ C++20)

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠ° массива Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ свой Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΠ· ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² элСмСнтов:

struct X
{
   int a[] = {1,2,3};  // ошибка
   int b[3] = {1,2,3}; // OK
};

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌ элСмСнтов ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ нСявноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ конструктора ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ класса ΠΈΠ»ΠΈ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ этого конструктора :

struct node {
    node* p = new node; // ошибка: использованиС нСявного ΠΈΠ»ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
                        // node::node()
};

БсылочныС элСмСнты Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ привязаны ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ элСмСнтам Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ элСмСнтов ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅; Ρ‚ΠΎ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ сущСствуСт для списков ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² элСмСнтов):

struct A
{
    A() = default;          // OK
    A(int v) : v(v) { }     // OK
    const int& v = 42;      // OK
};
A a1;    // ошибка: Π½Π΅Π²Π΅Ρ€Π½ΠΎ сформированная привязка Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊ ссылкС
A a2(1); // OK (ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ элСмСнта ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ игнорируСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ v появляСтся
         // Π² конструкторС)
         // ΠΎΠ΄Π½Π°ΠΊΠΎ a2.v это висячая ссылка
(начиная с C++11)

Если элСмСнт ссылка инициализируСтся ΠΈΠ· Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° элСмСнта ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Π΄ΠΎ C++20)элСмСнт ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ элСмСнта ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (начиная с C++20) ΠΈ Π΅Π³ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ прСдставляСт собой Π°Π³Ρ€Π΅Π³Π°Ρ‚Π½ΡƒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ элСмСнта ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π°:

struct A;
extern A a;
struct A
{
    const A& a1{ A{a, a}}; // OK
    const A& a2{ A{}};     // ошибка
};
A a{a, a};                  // OK
(начиная с C++17)

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

Имя нСстатичСского элСмСнта Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ нСстатичСской Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ элСмСнта ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‚Ρ€Ρ‘Ρ… ситуациях:

1) Как Ρ‡Π°ΡΡ‚ΡŒ выраТСния доступа ΠΊ элСмСнту класса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ класс Π»ΠΈΠ±ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ этот элСмСнт, Π»ΠΈΠ±ΠΎ являСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΡ‚ класса, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎ этот элСмСнт, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ нСявныС выраТСния доступа ΠΊ элСмСнту this->, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° имя нСстатичСского элСмСнта ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² любом ΠΈΠ· контСкстов, Π³Π΄Π΅ this Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½ (Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅Π» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-элСмСнтов, Π² списках ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² элСмСнтов, Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°Ρ… элСмСнтов ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Π½ΡƒΡ‚Ρ€ΠΈ класса).
struct S
{
    int m;
    int n;
    int x = m;            // OK: нСявный this-> Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½ Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°Ρ…
                          // ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (C++11)
    S(int i) : m(i), n(m) // OK: нСявный this-> Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½ Π² списках
                          // ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² элСмСнтов
    {
        this->f();        // явноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ доступа ΠΊ элСмСнту
        f();              // нСявный this-> Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½ Π² Ρ‚Π΅Π»Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-элСмСнтов
    }
    void f();
};
2) Π§Ρ‚ΠΎΠ±Ρ‹ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° нСстатичСский элСмСнт.
struct S
{
   int m;
   void f();
};
int S::*p = &S::m;       // OK: использованиС m для создания указатСля Π½Π° элСмСнт
void (S::*fp)() = &S::f; // OK: использованиС f для создания указатСля Π½Π° элСмСнт
3) (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-элСмСнтов) ΠŸΡ€ΠΈ использовании Π² Π½Π΅ΠΏΠΎΠ»Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°Ρ….
struct S
{
   int m;
   static const std::size_t sz = sizeof m; // OK: m Π² Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π΅
};

std::size_t j = sizeof(S::m + 42); // OK: хотя для m Π½Π΅ сущСствуСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° "this"
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ: Ρ‚Π°ΠΊΠΎΠ΅ использованиС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ посрСдством Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ CWG ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° 613 Π² N2253, которая рассматриваСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ компиляторами ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² C++11 (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ clang).

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

ΠœΠ°ΠΊΡ€ΠΎΡ тСст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ
__cpp_nsdmi 200809L (C++11) Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ нСстатичСских элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ…
__cpp_aggregate_nsdmi 201304L (C++14) АгрСгатныС классы с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ элСмСнтов ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

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

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

НомСр ΠŸΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½ ПовСдСниС Π² стандартС ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
CWG 80 C++98 всС элСмСнты Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ имя
, Ρ‡Ρ‚ΠΎ ΠΈ имя класса (Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с C)
Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ нСстатичСским элСмСнтам Π΄Π°Π½Π½Ρ‹Ρ… совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
имя класса, Ссли Π½Π΅Ρ‚ объявлСнного ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ конструктора
CWG 190 C++98 ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ совмСстимости ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ
ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π»ΠΈΡΡŒ всС элСмСнты
Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСстатичСскиС элСмСнты Π΄Π°Π½Π½Ρ‹Ρ…
CWG 613 C++98 Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ΅ использованиС нСстатичСских элСмСнтов
Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ допускаСтся
Ρ‚Π°ΠΊΠΎΠ΅ использованиС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ
CWG 645 C++98 Π½Π΅ Π±Ρ‹Π»ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, совмСстимы Π»ΠΈ с Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ
элСмСнты Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ поля ΠΈ Π½Π΅ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ поля
Π½Π΅ совмСстимоС Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅
CWG 1397 C++11 класс считался Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½Π½Ρ‹ΠΌ Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°Ρ…
элСмСнтов ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
инициализация элСмСнта ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚
Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ конструктора ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
CWG 1425 C++98 Π±Ρ‹Π»ΠΎ нСясно, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ со стандартным
Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΡ‚ ΠΆΠ΅ адрСс, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ
нСстатичСский элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
базового класса
нСстатичСский элСмСнт Π΄Π°Π½Π½Ρ‹Ρ…, Ссли ΠΎΠ½ присутствуСт,
Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΠΎΠ΄ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, Ссли ΠΎΠ½ присутствуСт
CWG 1696 C++98 ссылочныС элСмСнты ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹
Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ опрСдСлСниями (врСмя ΠΆΠΈΠ·Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…
закончится Π² ΠΊΠΎΠ½Ρ†Π΅ конструктора)
такая инициализация Π½Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π°
CWG 1719 C++98 Π½Π΅ Ρ‚Π°ΠΊ cv-ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π½Π΅ Π±Ρ‹Π»ΠΈ совмСстимы
с компоновкой
cv-квалификация игнорируСтся,
спСцификация ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π°
CWG 2254 C++11 ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° класс со стандартной ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ
Π±Π΅Π· элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ reinterpret_cast
Π² Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс
ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ reinterpret_cast Π² любой ΠΈΠ· Π΅Π³ΠΎ
Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов

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

классы
статичСскиС элСмСнты
нСстатичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-элСмСнты
провСряСт, являСтся Π»ΠΈ Ρ‚ΠΈΠΏ Ρ‚ΠΈΠΏΠΎΠΌ со стандартной ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ
(шаблон класса) [ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ]
смСщСниС Π² Π±Π°ΠΉΡ‚Π°Ρ… ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° Ρ‚ΠΈΠΏΠ° со стандартной ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта
(функция-макрос) [ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ]