Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 25

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

ПсСвдоним Ρ‚ΠΈΠΏΠ° β€” это имя Ρ‚ΠΈΠΏΠ°, ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ присутствуСт имя Ρ‚ΠΈΠΏΠ°.

wages hourly, weekly; // Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ double hourly, weekly;

SI item;              // Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Sales_item item

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, константы ΠΈ псСвдонимы Ρ‚ΠΈΠΏΠ°

ОбъявлСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ псСвдонимы Ρ‚ΠΈΠΏΠ°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ составныС Ρ‚ΠΈΠΏΡ‹ ΠΈ константы, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ объявлСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚ΠΈΠΏ pstring, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся псСвдонимом для Ρ‚ΠΈΠΏΠ° char*.

typedef char *pstring;

const pstring cstr = 0; // cstr - константный ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° char

const pstring *ps;      // ps - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° константный ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

                        // Π½Π° Ρ‚ΠΈΠΏ char

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π² этих ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… являСтся const pstring. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ const Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ Ρ‚ΠΈΠΏΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. Π’ΠΈΠΏ pstring β€” это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΈΠΏ char, a const pstring β€” это константный ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΈΠΏ char, Π½ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΈΠΏ const char.

Π—Π°ΠΌΠ°Π½Ρ‡ΠΈΠ²ΠΎ, Ρ…ΠΎΡ‚ΡŒ ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ объявлСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ псСвдоним Ρ‚ΠΈΠΏΠ° ΠΊΠ°ΠΊ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Π·Π°ΠΌΠ΅Π½Ρƒ псСвдонима, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π΅ΠΌΡƒ Ρ‚ΠΈΠΏΠΎΠΌ:

const char *cstr = 0; // Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ интСрпрСтация const pstring cstr

Однако эта интСрпрСтация Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°. Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΈΠΏ pstring Π² объявлСнии, Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ объявлСния являСтся Ρ‚ΠΈΠΏ указатСля. ΠŸΡ€ΠΈ пСрСзаписи объявлСния с использованиСм char*, Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ char, Π° * Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° объявлСния. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ β€” это const char. ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡŒ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ cstr ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Ρ‚ΠΈΠΏ const char, Π° Π½Π΅ константным ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Ρ‚ΠΈΠΏ char.

2.5.2. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΈΠΏΠ° auto

НСт Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π² ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ этого выраТСния. Когда ΠΌΡ‹ пишСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π° ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ (Π° ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ) ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ выраТСния. По Π½ΠΎΠ²ΠΎΠΌΡƒ стандарту ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ компилятору самому Π²Ρ‹ΡΡΠ½ΡΡ‚ΡŒ этот Ρ‚ΠΈΠΏ. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ спСцификатор Ρ‚ΠΈΠΏΠ° auto. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΡ… спСцификаторов Ρ‚ΠΈΠΏΠ°, ΠΊΠ°ΠΊ double, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, спСцификатор auto ΠΏΡ€ΠΈΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ компилятору вывСсти Ρ‚ΠΈΠΏ ΠΈΠ· ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. Π‘Π°ΠΌΠΎ собой разумССтся, Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ спСцификатор Ρ‚ΠΈΠΏΠ° auto, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€.

// Ρ‚ΠΈΠΏ item выводится ΠΈΠ· Ρ‚ΠΈΠΏΠ° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° суммы val1 ΠΈ val2

auto item = val1 + val2; // item инициализируСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ val1 + val2

Π—Π΄Π΅ΡΡŒ компилятор Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ item ΠΈΠ· Ρ‚ΠΈΠΏΠ° значСния, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° + ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ val1 ΠΈ val2. Если ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ val1 ΠΈ val2 β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса Sales_item (см. Ρ€Π°Π·Π΄Π΅Π» 1.5), Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ item Π±ΡƒΠ΄Π΅Ρ‚ класс Sales_item. Если эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏ double, Ρ‚ΠΎ Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ item Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΈΠΏ double ΠΈ Ρ‚.Π΄.

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

auto i = 0, *p = &i;    // ok: i - int, Π° p - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° int

auto sz = 0, pi = 3.14; // ошибка: нСсовмСстимыС Ρ‚ΠΈΠΏΡ‹ Ρƒ sz ΠΈ pi

БоставныС Ρ‚ΠΈΠΏΡ‹, const ΠΈ auto

Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ компилятором Ρ‚ΠΈΠΏ для спСцификатора auto Π½Π΅ всСгда Ρ‚ΠΎΡ‡Π½ΠΎ совпадаСт с Ρ‚ΠΈΠΏΠΎΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ соотвСтствовал ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, ΠΏΡ€ΠΈ использовании ссылки Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½Π° ссылаСтся. Π’ частности, ΠΏΡ€ΠΈ использовании ссылки ΠΊΠ°ΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠΌ являСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для вывСдСния Ρ‚ΠΈΠΏΠ° auto.

int i = 0, &r = i;

auto a = r; // a - int (r - псСвдоним для i, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ int)

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° auto ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ спСцификаторы const Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня (см. Ρ€Π°Π·Π΄Π΅Π» 2.4.3). Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² инициализациях, спСцификаторы const Π½ΠΈΠΆΠ½Π΅Π³ΠΎ уровня ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² случаС, ΠΊΠΎΠ³Π΄Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° константу.

const int ci = i, &cr = ci;

auto b = ci;  // b - int (const Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня Π² ci ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½)

auto с = cr;  // с - int (cr - псСвдоним для ci с const Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ

              // ΡƒΡ€ΠΎΠ²Π½Ρ)

auto d = &i;  // d - int* (& ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° int - int*)

auto e = &ci; // e - const int* (& константного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° - const Π½ΠΈΠΆΠ½Π΅Π³ΠΎ

              // уровня)

Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π±Ρ‹Π» спСцификатор const Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, Π΅Π³ΠΎ слСдуСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ явно.

const auto f = ci; // Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ci - int; Ρ‚ΠΈΠΏ f - const int

МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ссылка Π½Π° автоматичСски Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ всС Π΅Ρ‰Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹.

auto &g = ci; // g - const int&, связанный с ci

auto &h = 42; // ошибка: нСльзя ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ссылку с Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠΌ

const auto &j = 42; // ok: ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½ΡƒΡŽ ссылку с Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠΌ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ

Когда Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ ссылка Π½Π° автоматичСски Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, спСцификаторы const Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ Π½Π΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈ связывании ссылки с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, спСцификаторы const Π½Π΅ относятся ΠΊ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌΡƒ ΡƒΡ€ΠΎΠ²Π½ΡŽ.

ΠŸΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ Π²Π°ΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ссылка ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ β€” это Ρ‡Π°ΡΡ‚ΡŒ спСцифичСского ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° объявлСния, Π° Π½Π΅ Ρ‡Π°ΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° объявлСния. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ совмСстимы с автоматичСски Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ:

auto k = ci, &l = i;    // k - int; l - int&

auto &m = ci, *p = &ci; // m - const int&; p - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° const int

// ошибка: Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΈΠ· i - int;

// Ρ‚ΠΈΠΏ, Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ· &ci - const int

auto &n = i, *p2 = &ci;

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 2.5.2

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 2.33. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ опрСдСлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ· этого Ρ€Π°Π·Π΄Π΅Π»Π° ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ происходит Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· этих присвоСний.

а = 42; b = 42; с = 42;

d = 42; Π΅ = 42; g = 42;

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 2.34. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ присвоСния ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ упраТнСния. Π’Ρ‹Π²Π΅Π΄ΠΈΡ‚Π΅ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π΄ΠΎ ΠΈ послС присвоСний, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ. Если ΠΎΠ½ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹, ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π΅Ρ‰Π΅ Ρ€Π°Π· ΠΈ выяснитС, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌΡƒ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 2.35. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ Ρ‚ΠΈΠΏΡ‹, Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ. Π—Π°Ρ‚Π΅ΠΌ Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² своСй ΠΏΡ€Π°Π²ΠΎΡ‚Π΅.

const int i = 42;

auto j = i; const auto &k = i; auto *p = &i;

const auto j2 = i, &k2 = i;

2.5.3. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΈΠΏΠ° decltype

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

decltype(f()) sum = x; // sum ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ,

                       // ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ функция f

Π—Π΄Π΅ΡΡŒ компилятор Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ f(), Π½ΠΎ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΠ» Π±Ρ‹ Ρ‚Π°ΠΊΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ sum. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, компилятор Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ sum Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f().

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, спСцификатор decltype ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ спСцификатор const Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня ΠΈ ссылки, Π½ΠΎ нСсколько отличаСтся ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ спСцификатор auto. Когда Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ спСцификатор decltype, являСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ спСцификатор const Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня ΠΈ ссылки.

const int ci = 0, &cj = ci;

decltype(ci) x = 0; // x ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ const int

decltype(cj) y = x; // y ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ const int& ΠΈ связана с x

decltype(сj) z; // ошибка: z - ссылка, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ cj β€” ссылка, decltype (cj) β€” ссылочный Ρ‚ΠΈΠΏ. Как ΠΈ Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ссылку, ссылку z слСдуСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. 

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ спСцификатор decltype β€” СдинствСнный контСкст, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ пСрСмСнная ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ссылка Π½Π΅ рассматриваСтся ΠΊΠ°ΠΊ синоним ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½Π° ссылаСтся.