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

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΈΠ· 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
Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-элСмСнты
Π¨Π°Π±Π»ΠΎΠ½Ρ‹
Π Π°Π·Π½ΠΎΠ΅
 
 

КаТдоС имя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ появляСтся Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° C++, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, нСсмСТной части исходного ΠΊΠΎΠ΄Π°, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Π΅Π³ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости.

Π’ ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… области видимости поиск Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для связывания ΠΈΠΌΠ΅Π½ΠΈ с Π΅Π³ΠΎ объявлСниСм.

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости Π±Π»ΠΎΠΊΠ°

ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, прСдставлСнной объявлСниСм Π² Π±Π»ΠΎΠΊΠ΅ (составной ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€), начинаСтся Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ объявлСния ΠΈ заканчиваСтся Π² ΠΊΠΎΠ½Ρ†Π΅ Π±Π»ΠΎΠΊΠ°. ЀактичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости такая ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ сущСствуСт Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° с объявлСниСм, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΠ΅ имя (Π² этом случаС вся ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ объявлСния ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΈΠ· области видимости внСшнСго объявлСния)

int main()
{
    int a = 0; // начинаСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ΅Ρ€Π²ΠΎΠΉ 'a'
    ++a; // имя 'a' находится Π² области видимости ΠΈ ссылаСтся Π½Π° ΠΏΠ΅Ρ€Π²ΡƒΡŽ 'a'
    {
        int a = 1; // начинаСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π²Ρ‚ΠΎΡ€ΠΎΠΉ 'a'
                   // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ΅Ρ€Π²ΠΎΠΉ 'a' ΠΏΡ€Π΅Ρ€Π²Π°Π½Π°
        a = 42;    // 'a' Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΈ ссылаСтся Π½Π° Π²Ρ‚ΠΎΡ€ΡƒΡŽ 'a'                 
    } // Π±Π»ΠΎΠΊ заканчиваСтся, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π²Ρ‚ΠΎΡ€ΠΎΠΉ 'a' заканчиваСтся
      //             ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ΅Ρ€Π²ΠΎΠΉ 'a' восстанавливаСтся
} // Π±Π»ΠΎΠΊ заканчиваСтся, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ΅Ρ€Π²ΠΎΠΉ 'a' заканчиваСтся
int b = a; // Ошибка: имя 'a' Π²Π½Π΅ области видимости

ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΈΠΌΠ΅Π½ΠΈ, объявлСнного Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, начинаСтся Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ объявлСния ΠΈ заканчиваСтся, ΠΊΠΎΠ³Π΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΈ Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠ°.

try {   
    f();
} catch(const std::runtime_error& re) { // начинаСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости re
    int n = 1; // начинаСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости n
    std::cout << re.what(); // re находится Π² области видимости
} // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости re заканчиваСтся, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости n заканчиваСтся
 catch(std::exception& e) {
    std::cout << re.what(); // ошибка: re находится Π²Π½Π΅ области видимости
    ++n; // ошибка: n находится Π²Π½Π΅ области видимости
}

ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΈΠΌΡ‘Π½ начинаСтся Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ объявлСния ΠΈ заканчиваСтся Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°:

  • ΠΈΠΌΠ΅Π½Π°, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² инструкции-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° for
  • ΠΈΠΌΠ΅Π½Π°, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² условии Ρ†ΠΈΠΊΠ»Π° for
  • ΠΈΠΌΠ΅Π½Π°, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² объявлСнии Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Ρ†ΠΈΠΊΠ»Π° range-for
(начиная с C++11)
  • ΠΈΠΌΠ΅Π½Π°, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² инструкции-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° if statement ΠΈΠ»ΠΈ switch
(начиная с C++17)
  • ΠΈΠΌΠ΅Π½Π°, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² условии ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° if, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° switch ΠΈΠ»ΠΈ Ρ†ΠΈΠΊΠ»Π° while
Base* bp = new Derived;
if(Derived* dp = dynamic_cast<Derived*>(bp))
{
    dp->f(); // dp Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости
} // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости dp заканчиваСтся
        
for(int n = 0; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости n начинаСтся
    n < 10;    // n Π² области видимости
    ++n)       // n Π² области видимости
{
    std::cout << n << ' '; // n Π² области видимости
} // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости n заканчиваСтся

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ лямбда-выраТСния) ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, локальной для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ __func__) (начиная с C++11), начинаСтся с Ρ‚ΠΎΡ‡ΠΊΠΈ Π΅Ρ‘ объявлСния.

  • Если блиТайший Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ являСтся Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π΅Π³ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости заканчиваСтся Π² ΠΊΠΎΠ½Ρ†Π΅ этого Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
  • Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π΅Π³ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости заканчиваСтся Π² ΠΊΠΎΠ½Ρ†Π΅ послСднСго ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π±Π»ΠΎΠΊΠ° try Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ»ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ссли Π±Π»ΠΎΠΊ try Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ использовался.
const int n = 3;

int f1(int n,     // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости глобальной 'n' ΠΏΡ€Π΅Ρ€Π²Π°Π½Π°,
                  // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° 'n' начинаСтся
       int y = n); // ошибка: Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ссылаСтся Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

int (*(*f2)(int n))[n]; // OK: ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ 'n'
                        // заканчиваСтся Π² ΠΊΠΎΠ½Ρ†Π΅ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€Π° своСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
                        // Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€Π΅ массива, глобальная n находится Π² области
// видимости (это объявлСниС указатСля Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив
// ΠΈΠ· 3-Ρ… int)

// Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ²
auto (*f3)(int n)->int (*)[n]; // ошибка: ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ 'n' ΠΊΠ°ΠΊ Π³Ρ€Π°Π½ΠΈΡ†Π° массива


int f(int n = 2)  // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости 'n' начинаСтся
try // Π±Π»ΠΎΠΊ try Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
{         // Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ начинаСтся
   ++n;   // 'n' находится Π² области видимости ΠΈ ссылаСтся Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
   {
      int n = 2; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ 'n' начинаСтся
                 // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ 'n' ΠΏΡ€Π΅Ρ€Π²Π°Π½Π° 
      ++n; // 'n' ссылаСтся Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² этом Π±Π»ΠΎΠΊΠ΅
    }            // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ 'n' ΠΏΡ€Π΅Ρ€Π²Π°Π½Π°
                 // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ 'n' возобновляСтся
} catch(...) {
   ++n; // n находится Π² области видимости ΠΈ ссылаСтся Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
   throw;
} // послСдний ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ заканчиваСтся, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°
  // Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ 'n' заканчиваСтся
int a = n; // OK: глобальная 'n' находится Π² области видимости

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ΠœΠ΅Ρ‚ΠΊΠ° (ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΊΠ°), объявлСнная Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, находится Π² области видимости всСй этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²ΠΎ всСх Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠ°Ρ…, Π΄ΠΎ ΠΈ послС Π΅Ρ‘ собствСнного объявлСния.

void f()
{
   {   
       goto label; // ΠΌΠ΅Ρ‚ΠΊΠ° Π² области видимости, Π΄Π°ΠΆΠ΅ Ссли объявлСна ΠΏΠΎΠ·ΠΆΠ΅
label:;
   }
   goto label; // ΠΌΠ΅Ρ‚ΠΊΠ° ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π±Π»ΠΎΠΊΠ°
}

void g()
{
    goto label; // ошибка: ΠΌΠ΅Ρ‚ΠΊΠ° Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости g()
}

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости пространства ΠΈΠΌΡ‘Π½

ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости любой сущности, объявлСнной Π² пространствС ΠΈΠΌΡ‘Π½, начинаСтся с объявлСния ΠΈ состоит ΠΈΠ· ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ всСх ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ пространств ΠΈΠΌΡ‘Π½ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΈΠΌΠ΅Π½ΠΈ пространства ΠΈΠΌΡ‘Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π·Π° Π½ΠΈΠΌ, плюс, для любой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ using, которая Π²Π²Π΅Π»Π° имя ΠΈΠ»ΠΈ всё Π΅Π³ΠΎ пространство ΠΈΠΌΡ‘Π½ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, ΠΎΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ этой области.

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ трансляции ("ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Ρ„Π°ΠΉΠ»Π°" ΠΈΠ»ΠΈ "глобальная ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости"), Ρ‚Π°ΠΊΠΆΠ΅ являСтся пространством ΠΈΠΌΡ‘Π½ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ называСтся "ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ глобального пространства ΠΈΠΌΡ‘Π½". ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости любой сущности, объявлСнной Π² области видимости глобального пространства ΠΈΠΌΡ‘Π½, начинаСтся с объявлСния ΠΈ продолТаСтся Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ трансляции.

Имя, объявлСнноС Π² бСзымянном пространствС ΠΈΠΌΡ‘Π½ ΠΈΠ»ΠΈ Π²ΠΎ встроСнном пространствС ΠΈΠΌΡ‘Π½, Π²ΠΈΠ΄Π½ΠΎ Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΌ пространствС ΠΈΠΌΡ‘Π½.

namespace N { // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости N начинаСтся (ΠΊΠ°ΠΊ элСмСнт глобального пространства ΠΈΠΌΡ‘Π½)
    int i; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости i начинаСтся
    int g(int a) { return a; } // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости g начинаСтся
    int j(); // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости j начинаСтся
    void q(); // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости q начинаСтся
    namespace {
        int x; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости x начинаСтся
    } // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости x Π½Π΅ заканчиваСтся
    inline namespace inl { // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости inl начинаСтся
      int y; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости y начинаСтся
    } // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости y Π½Π΅ заканчиваСтся
} // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости i,g,j,q,inl,x,y ΠΏΡ€Π΅Ρ€Π²Π°Π½Π°

namespace {
    int l=1; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости l начинаСтся
} // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости l Π½Π΅ заканчиваСтся (это элСмСнт бСзымянного пространства ΠΈΠΌΡ‘Π½)

namespace N { // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости i,g,j,q,inl,x,y продолТаСтся
    int g(char a) {  // ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ N::g(int)
        return l+a;  // l ΠΈΠ· бСзымянного пространства ΠΈΠΌΡ‘Π½ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости
    }
    int i; // ошибка: ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π΅ΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ (i ΡƒΠΆΠ΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости)
    int j(); // OK: ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ
    int j() { // OK: ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π½Π΅Π΅ объявлСнной N::j()
        return g(i); // Π²Ρ‹Π·ΠΎΠ² N::g(int)
    }
    int q(); // ошибка: q ΡƒΠΆΠ΅ находится Π² области с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ
} // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости i,g,j,q,inl,x,y ΠΏΡ€Π΅Ρ€Π²Π°Π½Π°

int main() {
    using namespace N; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости i,g,j,q,inl,x,y возобновляСтся
    i = 1; // N::i Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости
    x = 1; // N::(анонимная)::x Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости
    y = 1; // N::inl::y Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости
    inl::y = 2; // N::inl Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости
} // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости i,g,j,q,inl,x,y ΠΏΡ€Π΅Ρ€Π²Π°Π½Π°

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости класса

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

class X {
    int f(int a = n) { // X::n находится Π² области видимости Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
         return a*n;   // X::n находится Π² области видимости Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
    }
    using r = int;
    r g();
    int i = n*2;   // X::n находится Π² области видимости Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

//  int x[n];      // Ошибка: n Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Ρ‚Π΅Π»Π° класса
    static const int n = 1;
    int x[n];      // OK: n Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ находится Π² области видимости Ρ‚Π΅Π»Π° класса
};

//r X::g() {       // Ошибка: r Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-элСмСнта
                   // внС класса
auto X::g()->r {   // OK: ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ X::r находится Π² области видимости
    return n;      // X::n находится Π² области видимости Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-элСмСнта Π²Π½Π΅ класса
}

Если имя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ‚Π΅Π»Π΅ класса Π΄ΠΎ Π΅Π³ΠΎ объявлСния, Π° Π΄Ρ€ΡƒΠ³ΠΎΠ΅ объявлСниС этого ΠΈΠΌΠ΅Π½ΠΈ находится Π² области видимости, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ сформирована, диагностика Π½Π΅ трСбуСтся.

typedef int c; // ::c
enum { i = 1 }; // ::i
class X {
    char v[i]; // Ошибка: Π² этой Ρ‚ΠΎΡ‡ΠΊΠ΅, i ссылаСтся Π½Π° ::i,
               // Π½ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ X::i
    int f() {
         return sizeof(c); // OK: X::c, Π½Π΅ ::c находится Π² области видимости Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-элСмСнта
    }
    char c; // X::c
    enum { i = 2 }; // X::i
};

typedef char* T;
struct Y {
    T a; // Ошибка: Π² этой Ρ‚ΠΎΡ‡ΠΊΠ΅, T ссылаСтся Π½Π° ::T,
         // Π½ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Y::T
    typedef long T;
    T b;
};

ИмСна Π»ΡŽΠ±Ρ‹Ρ… элСмСнтов класса ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… контСкстах:

  • Π² области видимости своСго класса ΠΈΠ»ΠΈ Π² области видимости ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса
  • послС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ., ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Ρ‚ΠΈΠΏΠ° Π΅Π³ΠΎ класса ΠΈΠ»ΠΈ класса, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚ Π½Π΅Π³ΠΎ
  • послС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ->, ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Ρ‚ΠΈΠΏΠ° указатСля Π½Π° Π΅Π³ΠΎ класс ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ Π½Π΅Π³ΠΎ класс
  • послС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ::, ΠΏΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΊ ΠΈΠΌΠ΅Π½ΠΈ Π΅Π³ΠΎ класса ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚ Π½Π΅Π³ΠΎ класса

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости пСрСчислСния

ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости пСрСчислитСля пСрСчислСния Π±Π΅Π· области видимости начинаСтся Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ объявлСния ΠΈ заканчиваСтся Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ области видимости.

ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости пСрСчислитСля пСрСчислСния с ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости начинаСтся Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ объявлСния ΠΈ заканчиваСтся Π² ΠΊΠΎΠ½Ρ†Π΅ спСцификатора пСрСчислСния.

(начиная с C++11)
enum e1_t { // пСрСчислСниС Π±Π΅Π· области видимости
  A,
  B = A*2
}; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости A ΠΈ B Π½Π΅ заканчиваСтся

enum class e2_t { // пСрСчислСниС с ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости
    SA,
    SB = SA*2 // SA находится Π² области видимости
}; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости SA ΠΈ SB заканчиваСтся

e1_t e1 = B; // OK, B находится Π² области видимости
// e2_t e2 = SB; // Ошибка: SB Π½Π΅ находится Π² области видимости
e2_t e2 = e2_t::SB; // OK

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона

ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона начинаСтся нСпосрСдствСнно Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ объявлСния ΠΈ продолТаСтся Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° наимСньшСго объявлСния шаблона, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ Π±Ρ‹Π» Π²Π²Π΅Π΄Ρ‘Π½. Π’ частности, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона ΠΈ Π² спСцификациях Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона.

template< typename T, // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости T начинаСтся
          T* p,       // T ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ Ρ‚ΠΈΠΏΠΎΠΌ
          class U = T // T ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ‚ΠΈΠΏΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
        >
class X : public Array<T> // T ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΈΠΌΠ΅Π½ΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса
{
   // T ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅Π»Π°
}; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости T ΠΈ U Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости X продолТаСтся

ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблонного ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона, это наимСньший список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² шаблона, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ появляСтся это имя

template< template< // ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона
                    typename Y,     // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Y начинаСтся
                    typename G = Y // Y находится Π² области видимости
                  > // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Y ΠΈ G Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ
          class T,
//          typename U = Y // Ошибка: Y находится Π²Π½Π΅ области видимости
          typename U
        >
class X
{
}; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости T ΠΈ U Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ

Подобно Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ областям видимости, имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона скрываСт Ρ‚ΠΎ ΠΆΠ΅ имя ΠΈΠ· внСшнСй области видимости Π½Π° врСмя своСго сущСствования:

typedef int N;
template< N X, // ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π΅ Ρ‚ΠΈΠΏ Ρ‚ΠΈΠΏΠ° int
          typename N, // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости этого N начинаСтся, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости
                      // ::N ΠΏΡ€Π΅Ρ€Π²Π°Π½Π°
          template<N Y> class T // N здСсь ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона, Π° Π½Π΅ int
         > struct A;

Π’ΠΎΡ‡ΠΊΠ° объявлСния

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости начинаСтся с Ρ‚ΠΎΡ‡ΠΊΠΈ объявлСния, которая располоТСна ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΠΌΡ‘Π½, прСдставлСнных простыми объявлСниями, Ρ‚ΠΎΡ‡ΠΊΠ° объявлСния находится сразу послС объявлСния ΠΈΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, Ссли Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ имССтся:

int x = 32; // внСшний x находится Π² области видимости
{
    int x = x; // Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ x находится Π² области видимости Π΄ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° (= x)
               // ΠΏΡ€ΠΈ этом Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ x Π½Π΅ инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ внСшнСго x (32),
               // ΠΏΡ€ΠΈ этом Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ x инициализируСтся собствСнным (Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ)
               // Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ
}
std::function<int(int)> f = [&](int n){return n>1 ? n*f(n-1) : n;};
           // имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ 'f' находится Π² области видимости лямбда ΠΈ
           // ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ ΠΏΠΎ ссылкС, дСлая Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ рСкурсивным
const int x = 2; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ 'x' начинаСтся
{
    int x[x] = {}; // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ x начинаСтся Π΄ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° (= {}),
                   // Π½ΠΎ послС Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€Π° (x[x]). Π’Π½ΡƒΡ‚Ρ€ΠΈ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€Π° внСшний
                   // 'x' всё Π΅Ρ‰Ρ‘ Π² области видимости. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ массив ΠΈΠ· 2-Ρ… int.
}

Π’ΠΎΡ‡ΠΊΠ° объявлСния класса ΠΈΠ»ΠΈ шаблона класса находится сразу послС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π½ΡƒΠ΅Ρ‚ класс (ΠΈΠ»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ шаблона, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π½ΡƒΠ΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ шаблона), появляСтся Π² Π΅Π³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ класса, ΠΈ ΡƒΠΆΠ΅ находится Π² области видимости Π² спискС Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов:

// S находится Π² области видимости Ρ‡Π΅Ρ€Π΅Π· Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅
struct S: std::enable_shared_from_this<S> {};

ПолоТСниС спСцификатор пСрСчислСния ΠΈΠ»ΠΈ объявлСния Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ³ΠΎ пСрСчислСния (начиная с C++11) находится сразу послС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π½ΡƒΠ΅Ρ‚ пСрСчислСниС.

enum E : int { // E ΡƒΠΆΠ΅ Π² области видимости
    A = sizeof(E)
};

Π’ΠΎΡ‡ΠΊΠ° объявлСния псСвдонима Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ псСвдонима шаблона находится сразу послС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Ρ‚ΠΈΠΏΠ°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся псСвдоним:

using T = int; // Ρ‚ΠΎΡ‡ΠΊΠ° объявлСния T находится Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ с запятой
using T = T;   // Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ T = int

Π’ΠΎΡ‡ΠΊΠ° объявлСния Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€Π° Π² объявлСнии using, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ ΠΈΠΌΠ΅Π½ΡƒΠ΅Ρ‚ конструктор, находится сразу послС Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€Π°:

template<int N>
class base {
protected:
    static const int next = N + 1;
    static const int value = N;
};

struct derived : base<0>, base<1>, base<2> {
    using base<0>::next, // next Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² области видимости
          base<next>::value; // derived::value Ρ€Π°Π²Π½ΠΎ 1
};

Π’ΠΎΡ‡ΠΊΠ° объявлСния пСрСчислитСля находится сразу послС Π΅Π³ΠΎ опрСдСлСния (Π° Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΊΠ°ΠΊ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…):

const int x = 12;
{
    enum { x = x + 1, // Ρ‚ΠΎΡ‡ΠΊΠ° объявлСния находится Π² запятой, x инициализируСтся
                      // Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 13
           y = x + 1  // ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ x Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ находится Π² области видимости,
                      // y инициализируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 14
         };
}

Π’ΠΎΡ‡ΠΊΠ° объявлСния ΠΈΠΌΠ΅Π½ΠΈ Π²Π½Π΅Π΄Ρ€Ρ‘Π½Π½ΠΎΠ³ΠΎ класса слСдуСт сразу Π·Π° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ скобкой Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π΅Π³ΠΎ класса (ΠΈΠ»ΠΈ шаблона класса):

template<typename T>
struct Array
// : std::enable_shared_from_this<Array> // Ошибка: имя Π²Π½Π΅Π΄Ρ€Ρ‘Π½Π½ΠΎΠ³ΠΎ класса Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π²
                                         // ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости
   : std::enable_shared_from_this< Array<T> > //OK: имя шаблона Array находится Π²
                                              // области видимости
{ // Π²Π½Π΅Π΄Ρ€Ρ‘Π½Π½ΠΎΠ΅ имя класса Array Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ находится Π² области видимости, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ имя
  // ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ элСмСнта
    Array* p; // ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Array<T>
};

Π’ΠΎΡ‡ΠΊΠ° объявлСния локальной для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ __func__ находится нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅Π»ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

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

Π’ΠΎΡ‡ΠΊΠ° объявлСния структурной привязки находится сразу послС списка ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² объявлСния структурной привязки, Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌ структурной привязки Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° любоС ΠΈΠ· Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΈΠΌΡ‘Π½.

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

Π’ΠΎΡ‡ΠΊΠ° объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ структурной привязки (начиная с C++17), ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… Π² объявлСнии_Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° основанного Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° for, находится сразу послС выраТСния_Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°:

std::vector<int> x;

for (auto x : x) { // Π²Π΅ΠΊΡ‚ΠΎΡ€ x находится Π² области видимости ΠΏΠ΅Ρ€Π΅Π΄
                   // Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ скобкой, auto x находится Π²
                   // области видимости Π² Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ скобкС
}
(начиная с C++11)

Π’ΠΎΡ‡ΠΊΠ° объявлСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона находится сразу послС ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° шаблона (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ):

typedef unsigned char T;
template<class T
  = T               // поиск Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ имя typedef unsigned char
  , T               // поиск Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона
    N = 0> struct A { };

Бсылки

  • C++23 стандарт (ISO/IEC 14882:2023):
  • 6.4 ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости [basic.scope]
  • C++20 стандарт (ISO/IEC 14882:2020):
  • 6.4 ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости [basic.scope]
  • C++17 стандарт (ISO/IEC 14882:2017):
  • 6.3 ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости [basic.scope]
  • C++14 стандарт (ISO/IEC 14882:2014):
  • 3.3 ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости [basic.scope]
  • C++11 стандарт (ISO/IEC 14882:2011):
  • 3.3 ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости [basic.scope]
  • C++98 стандарт (ISO/IEC 14882:1998):
  • 3.3 Π”Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ ΠΈ области видимости [basic.scope]

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

ДокумСнтация C ΠΏΠΎ ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости