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

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΡ‘Π½

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΈΠ· 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)
пустоС объявлСниС
 

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΡ‘Π½ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ прСдотвращСния ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΈΠΌΡ‘Π½ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ….

Бущности, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ° пространства ΠΈΠΌΡ‘Π½, ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ пространства ΠΈΠΌΡ‘Π½, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ… ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠ΅ принятиС Π·Π° сущности с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… областях видимости.

Бущности, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π²Π½Π΅ всСх Π±Π»ΠΎΠΊΠΎΠ² пространств ΠΈΠΌΡ‘Π½, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ пространству ΠΈΠΌΡ‘Π½. Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠ΅ пространство ΠΈΠΌΡ‘Π½ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ глобальной области видимости, ΠΈ Π½Π° Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ явно ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ с Π²Π΅Π΄ΡƒΡ‰ΠΈΠΌ ::. Π₯отя глобальноС пространство ΠΈΠΌΡ‘Π½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ объявлСния, ΠΎΠ½ΠΎ Π½Π΅ являСтся бСзымянным пространством ΠΈΠΌΡ‘Π½.

Π”ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ нСсколько Π±Π»ΠΎΠΊΠΎΠ² пространств ΠΈΠΌΡ‘Π½ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. ВсС объявлСния Π²Π½ΡƒΡ‚Ρ€ΠΈ этих Π±Π»ΠΎΠΊΠΎΠ² ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ области видимости пространства ΠΈΠΌΡ‘Π½.

Бинтаксис

namespace имя-пространства-ΠΈΠΌΡ‘Π½ { объявлСния } (1)
inline namespace имя-пространства-ΠΈΠΌΡ‘Π½ { объявлСния } (2) (начиная с C++11)
namespace { объявлСния } (3)
имя-пространства-ΠΈΠΌΡ‘Π½::имя (4)
using namespace имя-пространства-ΠΈΠΌΡ‘Π½; (5)
using имя-пространства-ΠΈΠΌΡ‘Π½::имя; (6)
namespace имя = ΠΏΠΎΠ»Π½ΠΎΠ΅-пространство-ΠΈΠΌΡ‘Π½ ; (7)
namespace имя-пространства-ΠΈΠΌΡ‘Π½:: имя { объявлСния } (8) (начиная с C++17)
namespace имя-пространства-ΠΈΠΌΡ‘Π½::inline имя { объявлСния (9) (начиная с C++20)
1) ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ пространства ΠΈΠΌΡ‘Π½ для пространства ΠΈΠΌΡ‘Π½ имя-пространства-ΠΈΠΌΡ‘Π½.
2) ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ встроСнного пространства ΠΈΠΌΡ‘Π½ для пространства ΠΈΠΌΡ‘Π½ имя-пространства-ΠΈΠΌΡ‘Π½. ОбъявлСния Π²Π½ΡƒΡ‚Ρ€ΠΈ имя-пространства-ΠΈΠΌΡ‘Π½ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π½Ρ‹ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ пространствС ΠΈΠΌΡ‘Π½.
3) ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ пространства ΠΈΠΌΡ‘Π½ Π±Π΅Π· названия. Π•Π³ΠΎ элСмСнты ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΎΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ объявлСния Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ трансляции ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ связываниС.
4) ИмСна пространств ΠΈΠΌΡ‘Π½ (вмСстС с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ классов) ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Π² Π»Π΅Π²ΠΎΠΉ части ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ области видимости ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ΡƒΡ‚ΠΎΡ‡Π½Ρ‘Π½Π½ΠΎΠ³ΠΎ поиска ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ.
5) Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° using: Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π½Π΅ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ поиска ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ любого ΠΈΠΌΠ΅Π½ΠΈ послС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ using ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° области видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΎ появляСтся, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ имя ΠΈΠ· имя-пространства-ΠΈΠΌΡ‘Π½ являСтся Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ объявлСно Π² блиТайшСм ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ пространствС ΠΈΠΌΡ‘Π½, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит ΠΊΠ°ΠΊ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ using, Ρ‚Π°ΠΊ ΠΈ имя-пространства-ΠΈΠΌΡ‘Π½.
6) using-объявлСниС: Π΄Π΅Π»Π°Π΅Ρ‚ символ имя ΠΈΠ· пространства ΠΈΠΌΡ‘Π½ имя-пространства-ΠΈΠΌΡ‘Π½ доступным для Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ поиска, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» объявлСн Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ области видимости класса, области видимости Π±Π»ΠΎΠΊΠ° ΠΈΠ»ΠΈ пространства ΠΈΠΌΡ‘Π½, Π³Π΄Π΅ появляСтся это using-объявлСниС.
7) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅-псСвдонима-пространства-ΠΈΠΌΡ‘Π½: Π΄Π΅Π»Π°Π΅Ρ‚ имя синонимом Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ пространства ΠΈΠΌΡ‘Π½: смотритС псСвдонимы пространств ΠΈΠΌΡ‘Π½
8) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ пространства ΠΈΠΌΡ‘Π½: namespace A::B::C { ... } эквивалСнтно namespace A { namespace B { namespace C { ... } } }.
9) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ встроСнного пространства ΠΈΠΌΡ‘Π½: namespace A::B::inline C { ... } эквивалСнтно namespace A::B { inline namespace C { ... } }. inline ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅Π΄ Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ пространства ΠΈΠΌΡ‘Π½, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ: namespace A::inline B::C {} эквивалСнтно namespace A { inline namespace B { namespace C {} } }.


ОбъяснСниС

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΡ‘Π½

inline(Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) namespace Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ { Ρ‚Π΅Π»ΠΎ-пространства-ΠΈΠΌΡ‘Π½ }
inline β€” (начиная с C++11) Ссли присутствуСт, Π΄Π΅Π»Π°Π΅Ρ‚ пространством ΠΈΠΌΡ‘Π½ встроСнным (смотритС Π½ΠΈΠΆΠ΅). НС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ-пространства-ΠΈΠΌΡ‘Π½, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅-исходного-пространства-ΠΈΠΌΡ‘Π½ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ inline
Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ β€” (начиная с C++17) Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ· любого количСства Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²
ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ β€” Π»ΠΈΠ±ΠΎ
  • Ρ€Π°Π½Π΅Π΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Π² этом случаС это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅-исходного-пространства-ΠΈΠΌΡ‘Π½;
  • имя пространства ΠΈΠΌΡ‘Π½, Π² этом случаС это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ-пространства-ΠΈΠΌΡ‘Π½;
  • ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ спСцификаторов Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… пространств ΠΈΠΌΡ‘Π½, Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… ::, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΈ Π² этом случаС это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅-Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ-пространства-ΠΈΠΌΡ‘Π½
(начиная с C++17)
Ρ‚Π΅Π»ΠΎ-пространства-ΠΈΠΌΡ‘Π½ β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, пустая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ объявлСний любого Ρ‚ΠΈΠΏΠ° (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ опрСдСлСния классов ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… пространств ΠΈΠΌΡ‘Π½)

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ пространств ΠΈΠΌΡ‘Π½ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² области пространства ΠΈΠΌΡ‘Π½, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ пространство ΠΈΠΌΡ‘Π½ (Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ-пространства-ΠΈΠΌΡ‘Π½), поиск ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ пространства ΠΈΠΌΡ‘Π½, Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒΡΡ Π² имя пространства ΠΈΠΌΡ‘Π½ (Π½Π΅ псСвдоним пространства ΠΈΠΌΡ‘Π½), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» объявлСн ΠΊΠ°ΠΊ элСмСнт Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ пространства ΠΈΠΌΡ‘Π½ ΠΈΠ»ΠΈ встроСнного пространства ΠΈΠΌΡ‘Π½ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ пространства ΠΈΠΌΡ‘Π½.

Π’Π΅Π»ΠΎ-пространства-ΠΈΠΌΡ‘Π½ опрСдСляСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости пространства ΠΈΠΌΡ‘Π½, которая влияСт Π½Π° поиск ΠΈΠΌΠ΅Π½ΠΈ.

ВсС ΠΈΠΌΠ΅Π½Π°, прСдставлСнныС объявлСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² Ρ‚Π΅Π»Π΅-пространства-ΠΈΠΌΡ‘Π½ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ опрСдСлСния Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… пространств ΠΈΠΌΡ‘Π½), становятся элСмСнтами пространства ΠΈΠΌΡ‘Π½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ пространства ΠΈΠΌΡ‘Π½ исходным ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ пространства ΠΈΠΌΡ‘Π½ (ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Π²Π΅Π»ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€), ΠΈΠ»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ пространства ΠΈΠΌΡ‘Π½ (ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ "ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΎ" ΡƒΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ пространство ΠΈΠΌΡ‘Π½)

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ пространства ΠΈΠΌΡ‘Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» объявлСн Π² Ρ‚Π΅Π»Π΅ пространства ΠΈΠΌΡ‘Π½, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ объявлСн Π²Π½Π΅ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ явной ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ

namespace Q {
  namespace V { // V являСтся элСмСнтом Q ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² Q
// namespace Q::V { // C++17 Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° Π΄Π²ΡƒΠΌ Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ строкам
    class C { void m(); }; // C являСтся элСмСнтом V ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² V
                           // C::m Ρ‚ΠΎΠ»ΡŒΠΊΠΎ объявлСна
    void f(); // f являСтся элСмСнтом V, Π½ΠΎ здСсь Ρ‚ΠΎΠ»ΡŒΠΊΠΎ объявлСна
  }
  void V::f() // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ f, ΠΊΠ°ΠΊ элСмСнта V, Π²Π½Π΅ V
              // ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΡ‘Π½, ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ f, ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ глобальноС пространство
              // ΠΈΠΌΡ‘Π½, Q ΠΈ Q::V
  {
      extern void h(); // Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ::Q::V::h
  }
  void V::C::m() // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ V::C::m Π²Π½Π΅ пространства ΠΈΠΌΡ‘Π½ (ΠΈ Ρ‚Π΅Π»Π° класса)
                 // Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ пространства ΠΈΠΌΡ‘Π½, это глобальноС пространство ΠΈΠΌΡ‘Π½,
                 // Q ΠΈ Q::V
  {
  }
}

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ объявлСния Π²Π½Π΅ пространства ΠΈΠΌΡ‘Π½ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ

  • послС Ρ‚ΠΎΡ‡ΠΊΠΈ объявлСния,
  • Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² области видимости пространства ΠΈΠΌΡ‘Π½ ΠΈ
  • Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² пространствах ΠΈΠΌΡ‘Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ исходноС пространство ΠΈΠΌΡ‘Π½ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ глобальноС пространство ΠΈΠΌΡ‘Π½). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° (начиная с C++14)
namespace Q {
  namespace V { // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅-исходного-пространства-ΠΈΠΌΡ‘Π½ для V
    void f(); // объявлСниС Q::V::f
  }
  void V::f() {} // OK
  void V::g() {} // Ошибка: g() Π½Π΅ являСтся элСмСнтом V
  namespace V { // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ-пространства-ΠΈΠΌΡ‘Π½ для V
    void g(); // объявлСниС Q::V::g
  }
}
namespace R { // Π½Π΅ являСтся Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΌ пространством ΠΈΠΌΡ‘Π½ для Q
   void Q::V::g() {} // Ошибка: Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Q::V::g Π²Π½ΡƒΡ‚Ρ€ΠΈ R
}
void Q::V::g() {} // OK: глобальноС пространство ΠΈΠΌΡ‘Π½ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Q

ИмСна, Π²Π²Π΅Π΄Ρ‘Π½Π½Ρ‹Π΅ объявлСниями friend Π² нСлокальном классС X, становятся элСмСнтами самого Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ пространства ΠΈΠΌΡ‘Π½ X, Π½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ становятся Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ для ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ поиска ΠΈΠΌΠ΅Π½ΠΈ (Π½ΠΈ для Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ, Π½ΠΈ для ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ), Ссли ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ объявлСниС Π½Π΅ прСдоставлСно Π² области видимости пространства ΠΈΠΌΡ‘Π½ Π΄ΠΎ ΠΈΠ»ΠΈ послС опрСдСлСния класса. Π’Π°ΠΊΠΎΠ΅ имя ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ADL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ пространства ΠΈΠΌΡ‘Π½, Ρ‚Π°ΠΊ ΠΈ классы.

Волько самоС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ пространство ΠΈΠΌΡ‘Π½ рассматриваСтся Ρ‚Π°ΠΊΠΈΠΌ friend-объявлСниСм ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ имя ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ с Ρ€Π°Π½Π΅Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ.

void h(int);
namespace A {
  class X {
    friend void f(X); // A::f являСтся друТСствСнной
    class Y {
        friend void g(); // A::g являСтся друТСствСнной
        friend void h(int); // A::h являСтся друТСствСнной, Π½Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° с ::h
    };
  };
  // A::f, A::g ΠΈ A::h Π½Π΅ Π²ΠΈΠ΄Π½Ρ‹ Π² области пространства ΠΈΠΌΡ‘Π½
  // Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ элСмСнтами пространства ΠΈΠΌΡ‘Π½ A
  X x;
  void g() {  // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ A::g
     f(x); // A::X::f находится Ρ‡Π΅Ρ€Π΅Π· ADL
  }
  void f(X) {}       // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ A::f
  void h(int) {}     // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ A::h
  // A::f, A::g ΠΈ A::h Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΈΠ΄Π½Ρ‹ Π² области пространства ΠΈΠΌΡ‘Π½
  // ΠΈ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π΄Ρ€ΡƒΠ·ΡŒΡ A::X ΠΈ A::X::Y
}

ВстроСнноС пространство ΠΈΠΌΡ‘Π½

ВстроСнноС пространство ΠΈΠΌΡ‘Π½, это пространство ΠΈΠΌΡ‘Π½, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово inline Π² своём ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ-исходного-пространства-ΠΈΠΌΡ‘Π½.

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ встроСнного пространства ΠΈΠΌΡ‘Π½ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ элСмСнтами Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ пространства ΠΈΠΌΡ‘Π½ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ситуациях (пСрСчислСнных Π½ΠΈΠΆΠ΅). Π­Ρ‚ΠΎ свойство Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚Π½ΠΎΠ΅: Ссли пространство ΠΈΠΌΡ‘Π½ N содСрТит встроСнноС пространство ΠΈΠΌΡ‘Π½ M, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, содСрТит встроСнноС пространство ΠΈΠΌΡ‘Π½ O, Ρ‚ΠΎ элСмСнты O ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ элСмСнтами M ΠΈΠ»ΠΈ N.

  • Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° using, которая ΠΈΠΌΠ΅Π½ΡƒΠ΅Ρ‚ встроСнноС пространство ΠΈΠΌΡ‘Π½, нСявно вставляСтся Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ пространство ΠΈΠΌΡ‘Π½ (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ нСявной Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ using для бСзымянного пространства ΠΈΠΌΡ‘Π½)
  • Π’ поискС, зависящСм ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΠ³Π΄Π° пространство ΠΈΠΌΡ‘Π½ добавляСтся ΠΊ Π½Π°Π±ΠΎΡ€Ρƒ связанных пространств ΠΈΠΌΡ‘Π½, Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π΅Π³ΠΎ встроСнныС пространства ΠΈΠΌΡ‘Π½, Π° Ссли встроСнноС пространство ΠΈΠΌΡ‘Π½ добавляСтся Π² список связанных пространств ΠΈΠΌΡ‘Π½, Ρ‚Π°ΠΊΠΆΠ΅ добавляСтся Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π΅Π³ΠΎ пространство ΠΈΠΌΡ‘Π½.
  • ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт встроСнного пространства ΠΈΠΌΡ‘Π½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ частично спСциализированным, , явно созданным ΠΈΠ»ΠΈ явно спСциализированным, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» элСмСнтом Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ пространства ΠΈΠΌΡ‘Π½.
  • ΠŸΠΎΠ»Π½Ρ‹ΠΉ поиск ΠΈΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ исслСдуСт Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ пространство ΠΈΠΌΡ‘Π½, Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΈΠ· встроСнных пространств ΠΈΠΌΡ‘Π½, Π΄Π°ΠΆΠ΅ Ссли Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ имя присутствуСт Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΌ пространствС ΠΈΠΌΡ‘Π½.
{ // Π² C++14, std::literals ΠΈ Π΅Π³ΠΎ пространства ΠΈΠΌΡ‘Π½ ΡΠ²Π»ΡΡŽΡ‚ΡΡ встроСнными
   using namespace std::string_literals; // Π΄Π΅Π»Π°Π΅Ρ‚ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ operator""s 
                                         // ΠΈΠ· std::literals::string_literals
   auto str = "abc"s;
}
{
   using namespace std::literals; // Π΄Π΅Π»Π°Π΅Ρ‚ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ ΠΊΠ°ΠΊ
                                  // std::literals::string_literals::operator""s,
                                  // Ρ‚Π°ΠΊ ΠΈ std::literals::chrono_literals::operator""s
   auto str = "abc"s;
   auto min = 60s;
}
{
   using std::operator""s; // Π΄Π΅Π»Π°Π΅Ρ‚ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ
                           // ΠΈ std::literals::string_literals::operator""s
                           // ΠΈ std::literals::chrono_literals::operator""s
   auto str = "abc"s;
   auto min = 60s;
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎ спСциализациях Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ вСрсиями Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ: Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ шаблона Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Ρ€Π°Π·Π½Ρ‹Ρ… встроСнных пространствах ΠΈΠΌΡ‘Π½, ΠΏΡ€ΠΈ этом позволяя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ пространство ΠΈΠΌΡ‘Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ явной спСциализации ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ шаблона.

namespace Lib
{
  inline namespace Lib_1
  {
    template <typename T> class A; 
  }

  template <typename T> void g(T) { /* ... */ }
}
/* ... */
struct MyClass { /* ... */ };
namespace Lib
{
  template<> class A<MyClass> { /* ... */ };
}

int main()
{
  Lib::A<MyClass> a;
  g(a);  // ΠΎΠΊ, Lib являСтся ассоциированным пространством ΠΈΠΌΡ‘Π½ A
}
(начиная с C++11)

БСзымянныС пространства ΠΈΠΌΡ‘Π½

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅-бСзымянного-пространства-ΠΈΠΌΡ‘Π½, это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ пространства ΠΈΠΌΡ‘Π½ Π² Ρ„ΠΎΡ€ΠΌΠ΅

inline(Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) namespace Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) { Ρ‚Π΅Π»ΠΎ-пространства-ΠΈΠΌΡ‘Π½ }
inline β€” (начиная с C++11) Ссли присутствуСт, Π΄Π΅Π»Π°Π΅Ρ‚ это встроСнным пространством ΠΈΠΌΡ‘Π½
Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ β€” (начиная с C++17) Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ любого количСства Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

Π­Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ рассматриваСтся ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ пространства ΠΈΠΌΡ‘Π½ с ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области видимости, которая ΠΈΠΌΠ΅Π½ΡƒΠ΅Ρ‚ это бСзымянноС пространство ΠΈΠΌΡ‘Π½ (ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: нСявно добавлСнная Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° using Π΄Π΅Π»Π°Π΅Ρ‚ пространство ΠΈΠΌΡ‘Π½ доступным для ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ поиска ΠΈΠΌΠ΅Π½ΠΈ ΠΈ Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ поиска ΠΈΠΌΠ΅Π½ΠΈ}, Π½ΠΎ Π½Π΅ для поиска, зависящСго ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ).

namespace {
    int i;  // ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ::(ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅)::i
}
void f() {
    i++;  // ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ::(ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅)::i
}

namespace A {
    namespace {
        int i; // A::(ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅)::i
        int j; // A::(ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅)::j
    }
    void g() { i++; } // A::ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅::i++
}

using namespace A; // Π²Π²ΠΎΠ΄ΠΈΡ‚ всС ΠΈΠΌΠ΅Π½Π° ΠΈΠ· A Π² глобальноС пространство ΠΈΠΌΡ‘Π½
void h() {
    i++;    // ошибка: ::(ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅)::i ΠΈ ::A::(ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅)::i Π² ΠΎΠ΄Π½ΠΎΠΉ области видимости
    A::i++; // ok, ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ::A::(ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅)::i
    j++;    // ok, ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ::A::(ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅)::j
}

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π° Π² бСзымянном пространствС ΠΈΠΌΡ‘Π½ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ с внСшним связываниСм, ΠΎΠ½ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ доступны ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΅Π΄ΠΈΠ½ΠΈΡ† трансляции, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ имя ΠΈΡ… пространства ΠΈΠΌΡ‘Π½ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ.

(Π΄ΠΎ C++11)

БСзымянныС пространства ΠΈΠΌΡ‘Π½, Π° Ρ‚Π°ΠΊΠΆΠ΅ всС пространства ΠΈΠΌΡ‘Π½, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ прямо ΠΈΠ»ΠΈ косвСнно Π² бСзымянном пространствС ΠΈΠΌΡ‘Π½, ΠΈΠΌΠ΅ΡŽΡ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ связываниС, ΠΈ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ любоС имя, объявлСнноС Π² бСзымянном пространствС ΠΈΠΌΡ‘Π½, ΠΈΠΌΠ΅Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ связываниС.

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

Using-объявлСния

Π’Π²ΠΎΠ΄ΠΈΡ‚ имя Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ объявлСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС, Π³Π΄Π΅ появляСтся это using-объявлСниС.

using typename(Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) спСцификатор-Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ-ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΉ-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ; (Π΄ΠΎ C++17)
using список-Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ; (начиная с C++17)
typename β€” ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово typename ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ нСобходимости для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ зависимых ΠΈΠΌΡ‘Π½, ΠΊΠΎΠ³Π΄Π° using-объявлСниС Π²Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΈΠΏ элСмСнта ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π² шаблон класса
спСцификатор-Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ-ΠΈΠΌΠ΅Π½ΠΈ β€” ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΡ‘Π½ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ области видимости ::, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π°ΡΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ области видимости. ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ :: относится ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ пространству ΠΈΠΌΡ‘Π½.
Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΉ-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ β€” Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€
список-Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² β€” Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ запятыми список ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² Ρ„ΠΎΡ€ΠΌΠ΅ typename(Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) спСцификатор-Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ-ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΉ-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. Π—Π° Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎΡ‡ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, хотя эта Ρ„ΠΎΡ€ΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов

using-объявлСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ввСдСния элСмСнтов пространства ΠΈΠΌΡ‘Π½ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ пространства ΠΈΠΌΡ‘Π½ ΠΈ Π±Π»ΠΎΠΊΠΈ области видимости, ΠΈΠ»ΠΈ для ввСдСния элСмСнтов Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π² опрСдСлСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов, ΠΈΠ»ΠΈ для ввСдСния пСрСчислитСлСй Π² пространство ΠΈΠΌΡ‘Π½, области видимости Π±Π»ΠΎΠΊΠΎΠ² ΠΈ классов (начиная с C++20).

using-объявлСниС с Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΈΠΌ using-Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ эквивалСнтно ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ using-объявлСний с ΠΎΠ΄Π½ΠΈΠΌ using-Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ.

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

Для использования Π² опрСдСлСниях ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов смотритС обявлСниС using.

ИмСна, Π²Π²Π΅Π΄Ρ‘Π½Π½Ρ‹Π΅ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ пространства ΠΈΠΌΡ‘Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ using-объявлСния, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»Π½Ρ‹ΠΉ поиск ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… областСй:

void f();
namespace A {
    void g();
}
namespace X {
    using ::f; // глобальная f Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΈΠ΄Π½Π° ΠΊΠ°ΠΊ ::X::f
    using A::g; // A::g Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΈΠ΄Π½Π° ΠΊΠ°ΠΊ ::X::g
    using A::g, A::g; // (C++17) OK: Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ объявлСниС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ
                      // Π² области видимости пространства ΠΈΠΌΡ‘Π½
}
void h()
{
    X::f(); // Π²Ρ‹Π·ΠΎΠ² ::f
    X::g(); // Π²Ρ‹Π·ΠΎΠ² A::g
}

Если послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ using-объявлСниС Π±Ρ‹Π»ΠΎ использовано для взятия элСмСнта ΠΈΠ· пространства ΠΈΠΌΡ‘Π½, пространство ΠΈΠΌΡ‘Π½ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ ΠΈ вводятся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ объявлСния для этого ΠΆΠ΅ ΠΈΠΌΠ΅Π½ΠΈ, эти Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ объявлСния Π½Π΅ становятся Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· using-объявлСниС (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ using). ЕдинствСнным ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся случай, ΠΊΠΎΠ³Π΄Π° using-объявлСниС ΠΈΠΌΠ΅Π½ΡƒΠ΅Ρ‚ шаблон класса: частичныС спСциализации, Π²Π²Π΅Π΄Ρ‘Π½Π½Ρ‹Π΅ ΠΏΠΎΠ·ΠΆΠ΅, фактичСски Π²ΠΈΠ΄Π½Ρ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΡ… поиск выполняСтся Ρ‡Π΅Ρ€Π΅Π· основной шаблон.

namespace A {
    void f(int);
}
using A::f; // ::f Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ синоним A::f(int)

namespace A { // Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ пространства ΠΈΠΌΡ‘Π½
   void f(char); // Π½Π΅ мСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ::f
}
void foo() {
    f('a'); // Π²Ρ‹Π·ΠΎΠ² f(int), Π΄Π°ΠΆΠ΅ Ссли сущСствуСт f(char).
} 
void bar() {
   using A::f; // эта f синоним ΠΊΠ°ΠΊ для A::f(int), Ρ‚Π°ΠΊ ΠΈ для A::f(char)
   f('a'); // Π²Ρ‹Π·ΠΎΠ² f(char)
}

Using-объявлСния Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ шаблона, ΠΈΠ»ΠΈ пространство ΠΈΠΌΡ‘Π½, ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости (Π΄ΠΎ C++20). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΎΡ€ Π² using-объявлСнии Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ имя, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, using-объявлСниС для пСрСчислСния Π½Π΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΅Π³ΠΎ пСрСчислитСлСй.

ВсС ограничСния Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ объявлСния с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΠΏΡ€Π°Π²ΠΈΠ»Π° скрытия ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΊ using-объявлСниям:

namespace A {
    int x;
}
namespace B {
    int i;
    struct g { };
    struct x { };
    void f(int);
    void f(double);
    void g(char); // OK: имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ g скрываСт структуру g
}
void func() {
    int i;
    using B::i; // ошибка: i объявлСна Π΄Π²Π°ΠΆΠ΄Ρ‹

    void f(char);
    using B::f; // OK: f(char), f(int), f(double) ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ°ΠΌΠΈ
    f(3.5); // Π²Ρ‹Π·ΠΎΠ² B::f(double)

    using B::g;
    g('a');      // Π²Ρ‹Π·ΠΎΠ² B::g(char)
    struct g g1; // ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ g1 с Ρ‚ΠΈΠΏΠΎΠΌ структуры B::g

    using B::x;
    using A::x;  // OK: скрываСт структуру B::x
    x = 99;      // присваиваниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ A::x
    struct x x1; // ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ x1 с Ρ‚ΠΈΠΏΠΎΠΌ структуры B::x
}

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

namespace B {
    void f(int);
    void f(double);
}
namespace C {
    void f(int);
    void f(double);
    void f(char);
}
void h() {
    using B::f; // Π²Π²ΠΎΠ΄ΠΈΡ‚ B::f(int), B::f(double)
    using C::f; // Π²Π²ΠΎΠ΄ΠΈΡ‚ C::f(int), C::f(double) ΠΈ C::f(char)
    f('h');      // Π²Ρ‹Π·ΠΎΠ² C::f(char)
    f(1);        // ошибка: B::f(int) или C::f(int)?
    void f(int); // ошибка: f(int) ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΠ΅Ρ‚ с C::f(int) ΠΈ B::f(int)
}

Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ объявлСн, Π½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² ΠΊΠ°ΠΊΠΎΠΌ-Π»ΠΈΠ±ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ пространствС ΠΈΠΌΡ‘Π½, Π° Π·Π°Ρ‚Π΅ΠΌ объявлСн с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ using-объявлСния Π²ΠΎ внСшнСм пространствС ΠΈΠΌΡ‘Π½, Π° Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎ внСшнСм пространствС ΠΈΠΌΡ‘Π½ появляСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ с Ρ‚Π΅ΠΌ ΠΆΠ΅ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ являСтся элСмСнтом внСшнСго пространства ΠΈΠΌΡ‘Π½ ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΠ΅Ρ‚ с using-объявлСниСм:

namespace X {
  namespace M {
     void g(); // объявлСна, Π½ΠΎ Π½Π΅ опрСдСляСт X::M::g()
  }
  using M::g;
  void g();   // Ошибка: ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ X::g, которая ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΠ΅Ρ‚ с X::M::g()
}

Π’ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅ΠΌ смыслС, объявлСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ появляСтся Π² любой области видимости пространства ΠΈΠΌΡ‘Π½ ΠΈ Π²Π²ΠΎΠ΄ΠΈΡ‚ имя с использованиСм Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, всСгда Π²Π²ΠΎΠ΄ΠΈΡ‚ элСмСнт Π² пространство ΠΈΠΌΡ‘Π½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΎ находится, Π° Π½Π΅ Π² любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ пространство ΠΈΠΌΡ‘Π½. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ явныС экзСмпляры ΠΈ явныС спСциализации ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ шаблона, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π²ΠΎ встроСнном пространствС ΠΈΠΌΡ‘Π½: ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π½Π΅ вводят Π½ΠΎΠ²ΠΎΠ΅ имя, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΌ пространствС ΠΈΠΌΡ‘Π½.


Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ using

using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° прСдставляСт собой Π±Π»ΠΎΡ‡Π½ΠΎΠ΅ объявлСниС со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ синтаксисом:

Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) using namespace спСцификато-Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ-ΠΈΠΌΠ΅Π½ΠΈ (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) имя-пространства-ΠΈΠΌΡ‘Π½ ; (1)
Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ β€” (начиная с C++11) любоС количСство Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊ этой using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅
спСцификатор-Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ-ΠΈΠΌΠ΅Π½ΠΈ β€” ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΡ‘Π½ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ области видимости ::, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π°ΡΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ области видимости. ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ :: ссылаСтся Π½Π° глобальноС пространство ΠΈΠΌΡ‘Π½. ΠŸΡ€ΠΈ поискС ΠΈΠΌΡ‘Π½ Π² этой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ lookup рассматриваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ объявлСния пространств ΠΈΠΌΡ‘Π½.
имя-пространства-ΠΈΠΌΡ‘Π½ β€” имя пространства ΠΈΠΌΡ‘Π½. ΠŸΡ€ΠΈ поискС этого ΠΈΠΌΠ΅Π½ΠΈ, поиск ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ объявлСния пространств ΠΈΠΌΡ‘Π½

Using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² области видимости пространства ΠΈΠΌΡ‘Π½ ΠΈ Π² области видимости Π±Π»ΠΎΠΊΠ°. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ поиска ΠΈΠΌΠ΅Π½ΠΈ любого ΠΈΠΌΠ΅Π½ΠΈ послС using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° области видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΎ появляСтся, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ имя ΠΈΠ· имя-пространства-ΠΈΠΌΡ‘Π½ являСтся Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ объявлСно Π² блиТайшСм ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ пространствС ΠΈΠΌΡ‘Π½, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит ΠΊΠ°ΠΊ using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ, Ρ‚Π°ΠΊ ΠΈ имя-пространства-ΠΈΠΌΡ‘Π½.

Using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π½Π΅ добавляСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠΌΡ‘Π½ Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° появляСтся (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ using-объявлСния), ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π΅ прСпятствуСт объявлСнию ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… ΠΈΠΌΡ‘Π½.

Using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚Π½Ρ‹ΠΌΠΈ для Ρ†Π΅Π»Π΅ΠΉ Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ поиска: Ссли ΠΎΠ±Π»Π°ΡΡ‚ΡŒ содСрТит using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ, которая прСдставляСт имя-пространства-ΠΈΠΌΡ‘Π½, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ само содСрТит using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ имя-пространства-ΠΈΠΌΡ‘Π½-2, эффСкт Ρ‚Π°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ using Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΈΠ· Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ пространства ΠΈΠΌΡ‘Π½ появлялись Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ эти Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚Π½Ρ‹Π΅ пространства ΠΈΠΌΡ‘Π½, Π½Π΅ влияСт Π½Π° поиск ΠΈΠΌΠ΅Π½ΠΈ.

namespace A {
    int i;
}
namespace B {
    int i;
    int j;
    namespace C {
        namespace D {
            using namespace A; // всС ΠΈΠΌΠ΅Π½Π° ΠΈΠ· A вводятся Π² глобальноС пространство ΠΈΠΌΡ‘Π½
            int j;
            int k;
            int a = i; // i это B::i, Ρ‚Π° ΠΊΠ°ΠΊ A::i скрыто ΠΏΠΎΠ΄ B::i
        }
        using namespace D; // ΠΈΠΌΠ΅Π½Π° ΠΈΠ· D вводятся Π² C
                           // ΠΈΠΌΠ΅Π½Π° ΠΈΠ· A вводятся Π² глобальноС пространство ΠΈΠΌΡ‘Π½
        int k = 89; // OK, объявлСниС ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π²Π²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ using
        int l = k;  // Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ: C::k ΠΈΠ»ΠΈ D::k
        int m = i;  // ok: B::i скрываСт A::i
        int n = j;  // ok: D::j скрываСт B::j
    }
}

Если послС использования using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ для ввСдСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ пространства ΠΈΠΌΡ‘Π½, пространство ΠΈΠΌΡ‘Π½ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ ΠΈ ΠΊ Π½Π΅ΠΌΡƒ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты ΠΈ/ΠΈΠ»ΠΈ using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, эти Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ пространства ΠΈΠΌΡ‘Π½ Π²ΠΈΠ΄Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ using-объявлСния)

namespace D {
   int d1;
   void f(char);
}
using namespace D; // Π²Π²ΠΎΠ΄ΠΈΡ‚ D::d1, D::f, D::d2, D::f,
                   //  E::e ΠΈ E::f Π² глобальноС пространство ΠΈΠΌΡ‘Π½!

int d1; // OK: Π½Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° с D::d1 ΠΏΡ€ΠΈ объявлСнии
namespace E {
    int e;
    void f(int);
}
namespace D { // Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ пространства ΠΈΠΌΡ‘Π½
    int d2;
    using namespace E; // транзитная using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°
    void f(int);
}
void f() {
    d1++; // ошибка: Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ::d1 ΠΈΠ»ΠΈ D::d1
    ::d1++; // OK
    D::d1++; // OK
    d2++; // OK, d2 это D::d2
    e++; // OK: e это E::e ΠΈΠ·-Π·Π° Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚Π½ΠΎΠ³ΠΎ using
    f(1); // ошибка: Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ: D::f(int) ΠΈΠ»ΠΈ E::f(int)?
    f('a'); // OK: f(char) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊ D::f(char)
}

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

using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° using namespace std; Π² любой области пространства ΠΈΠΌΡ‘Π½ Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ имя ΠΈΠ· пространства ΠΈΠΌΡ‘Π½ std Π² глобальноС пространство ΠΈΠΌΡ‘Π½ (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ глобальноС пространство ΠΈΠΌΡ‘Π½ являСтся блиТайшим пространством ΠΈΠΌΡ‘Π½, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит ΠΈ std ΠΈ любоС объявлСнноС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ пространство ΠΈΠΌΡ‘Π½), Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°ΠΌ ΠΈΠΌΡ‘Π½. Π­Ρ‚Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ using ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ Π² области видимости Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° (SF.7: НС ΠΏΠΈΡˆΠΈΡ‚Π΅ using namespace Π² глобальной области видимости Π² Ρ„Π°ΠΉΠ»Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°).

ΠœΠ°ΠΊΡ€ΠΎΡ ВСстирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ
__cpp_namespace_attributes 201411L (C++17) Атрибуты для пространств ΠΈΠΌΡ‘Π½

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

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ пространство ΠΈΠΌΡ‘Π½ для создания класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ Π±Ρ‹Π» ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ Π² пространствС ΠΈΠΌΡ‘Π½ std.

#include <vector>

namespace vec {

    template< typename T >
    class vector {
        // ...
    };

} // vec

int main()
{
    std::vector<int> v1; // Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€.
    vec::vector<int> v2; // ΠžΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€.

    v1 = v2; // Ошибка: v1 ΠΈ v2 ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

    {
        using namespace std;
        vector<int> v3; // Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ std::vector
        v1 = v3; // OK
    }

    {
        using vec::vector;
        vector<int> v4; // Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ vec::vector
        v2 = v4; // OK
    }
        
    return 0;
}

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

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

НомСр ΠŸΡ€ΠΈΠΌΠ΅Π½Ρ‘Π½ ПовСдСниС Π² стандартС ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
CWG 101 C++98 ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Ссли объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
Π² области видимости пространства ΠΈΠΌΡ‘Π½ ΠΈΠ»ΠΈ области видимости Π±Π»ΠΎΠΊΠ°
ΠΈ функция, прСдставлСнная using-объявлСниСм, ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ ΠΎΠ΄Π½Ρƒ
ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (Π±Π΅Π· нСоднозначности)
позволяСтся
CWG 373 C++98 поиск ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ объявлСния пространств ΠΈΠΌΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для
послСднСго ΠΈΠΌΠ΅Π½ΠΈ Π² ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π΅ using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ (Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ,
ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ классы Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ пространства ΠΈΠΌΡ‘Π½)
ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ поиска примСняСтся
ΠΊΠΎ всСм ΠΈΠΌΠ΅Π½Π°ΠΌ Π² ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°Ρ…
using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²
CWG 460 C++98 using-объявлСниС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ пространство ΠΈΠΌΡ‘Π½ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ
CWG 565 C++98 using-объявлСниС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠΉ
Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ области видимости, Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»ΠΎΡΡŒ ΠΊ
шаблонам Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΊ
шаблонам Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
CWG 986 C++98 Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π±Ρ‹Π»Π° Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½ΠΎΠΉ для ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ поиска Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для
Π½Π΅ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ поиска
CWG 987 C++98 сущности, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½, Ρ‚Π°ΠΊΠΆΠ΅
ΡΠ²Π»ΡΡŽΡ‚ΡΡ элСмСнтами ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ пространства ΠΈΠΌΡ‘Π½
Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ области видимости
ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹
CWG 1021 C++98 Π±Ρ‹Π»ΠΎ нСясно, считаСтся Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ вводится Π²
пространство ΠΈΠΌΡ‘Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ using-объявлСния, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ Π² этом
пространствС ΠΈΠΌΡ‘Π½
Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² этом пространствС
ΠΈΠΌΡ‘Π½
CWG 1838 C++14 Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²ΠΎ внСшнСм пространствС ΠΈΠΌΡ‘Π½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ
ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ, Π½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ пространствС ΠΈΠΌΡ‘Π½
ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ using
Π½Π΅ΠΏΠΎΠ»Π½Ρ‹Π΅ опрСдСлСния всСгда
относятся ΠΊ ΠΈΡ… пространствам ΠΈΠΌΡ‘Π½
CWG 2155 C++98 Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ CWG ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° 1838 Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»ΠΎΡΡŒ ΠΊ объявлСниям
классов ΠΈ пСрСчислСний
примСняСтся

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

псСвдоним пространства ΠΈΠΌΡ‘Π½ создаёт псСвдоним ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ пространства ΠΈΠΌΡ‘Π½[ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ]