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

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

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

ΠšΡ€ΠΎΠΌΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ бСзопасного удалСния ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСмСщСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² допустимом состоянии. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ допустимым считаСтся Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ бСзопасно присвоСно Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ способами, Π½Π΅ зависящими ΠΎΡ‚ Π΅Π³ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ значСния. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ пСрСмСщСния Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ значСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ остаСтся Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ значСния ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° послС пСрСмСщСния.

НапримСр, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠ³ΠΎ класса string ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° извСстно, Ρ‡Ρ‚ΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ пСрСмСщСния остаСтся допустимым. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ для ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² пСрСмСщСния ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ empty() ΠΈΠ»ΠΈ size(). Однако ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΡ… выполнСния Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π›ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ пСрСмСщСния Π±ΡƒΠ΄Π΅Ρ‚ пуст, Π½ΠΎ это Π½Π΅ гарантируСтся.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСмСщСния класса StrVec ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ пСрСмСщСния Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ состоянии, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ находился Π±Ρ‹ послС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ класса StrVec ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ с Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ с Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ класса StrVec. Π”Ρ€ΡƒΠ³ΠΈΠ΅ классы, с Π±ΠΎΠ»Π΅Π΅ слоТной Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ структурой, ΠΌΠΎΠ³ΡƒΡ‚ вСсти сСбя ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ.

ПослС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ пСрСмСщСния "ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚" Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΌ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π½ΠΎ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ нСпрСдсказуСмо.

Π‘ΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСмСщСния

Подобно конструктору ΠΊΠΎΠΏΠΈΠΉ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ присвоСния ΠΊΠΎΠΏΠΈΠΈ, компилятор способСн сам ΡΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ конструктор пСрСмСщСния ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ. Однако условия, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ синтСзируСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСмСщСния, вСсьма ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ Ρ‚Π΅Ρ…, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ синтСзируСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ копирования.

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

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

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

// компилятор синтСзируСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСмСщСния для X ΠΈ hasX

struct X {

 int i; // встроСнныС Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½Ρ‹

 std::string s; // string опрСдСляСт собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСмСщСния

};

struct hasX {

 X mem; // для X синтСзированы Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСмСщСния

};

X x, Ρ…2 = std::move(x); // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ синтСзируСмый конструктор

                        // пСрСмСщСния

hasX hx, hx2 = std::move(hx); // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ синтСзируСмый конструктор

                              // пСрСмСщСния

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

β€’ Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ копирования, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСмСщСния Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ нСявно ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅. Но Ссли явно Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ компилятор ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ пСрСмСщСния, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² = default (см. Ρ€Π°Π·Π΄Π΅Π» 7.1.4), Π½ΠΎ компилятор окаТСтся нСспособСн ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ всС Ρ‡Π»Π΅Π½Ρ‹, Ρ‚ΠΎ функция пСрСмСщСния Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΠΊ удалСнная. Π’Π°ΠΆΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ»Π°, согласно ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ синтСзируСмая функция пСрСмСщСния опрСдСляСтся ΠΊΠ°ΠΊ удалСнная, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΌΡƒ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ копирования (см. Ρ€Π°Π·Π΄Π΅Π» 13.1.6).

β€’ Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ конструктора ΠΊΠΎΠΏΠΈΠΉ, конструктор пСрСмСщСния опрСдСляСтся ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ, Ссли Ρƒ класса Π΅ΡΡ‚ΡŒ Ρ‡Π»Π΅Π½, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ собствСнный конструктор ΠΊΠΎΠΏΠΈΠΉ, Π½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ конструктор пСрСмСщСния, ΠΈΠ»ΠΈ Ссли Ρƒ класса Π΅ΡΡ‚ΡŒ Ρ‡Π»Π΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ опрСдСляСт собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ копирования ΠΈ для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ компилятор нСспособСн ΡΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ конструктор пСрСмСщСния. Π’ΠΎ ΠΆΠ΅ относится ΠΊ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ.

β€’ ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ пСрСмСщСния ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅, Ссли Ρƒ класса Π΅ΡΡ‚ΡŒ Ρ‡Π»Π΅Π½, собствСнный конструктор пСрСмСщСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ»ΠΈ нСдоступСн.

β€’ ΠšΠ°ΠΊ ΠΈ конструктор ΠΊΠΎΠΏΠΈΠΉ, конструктор пСрСмСщСния опрСдСляСтся ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ, Ссли дСструктор ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ»ΠΈ нСдоступСн.

β€’ ΠšΠ°ΠΊ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ опрСдСляСтся ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ, Ссли Ρƒ класса Π΅ΡΡ‚ΡŒ константный ΠΈΠ»ΠΈ ссылочный Ρ‡Π»Π΅Π½.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Π² классС Y ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ собствСнный конструктор ΠΊΠΎΠΏΠΈΠΉ, Π½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ собствСнный конструктор пСрСмСщСния:

// класс Y опрСдСляСт собствСнный конструктор ΠΊΠΎΠΏΠΈΠΉ, Π½ΠΎ Π½Π΅ конструктор

// пСрСмСщСния

struct hasY {

 hasY() = default;

 hasY(hasY&&) = default;

 Y mem; // hasY Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ конструктор пСрСмСщСния

};

hasY hy, hy2 = std::move(hy); // ошибка: конструктор пСрСмСщСния ΡƒΠ΄Π°Π»Π΅Π½

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° Y, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ…. Класс hasY явно запросил конструктор пСрСмСщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ компилятор Π½Π΅ способСн ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, класс hasY ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ конструктор пСрСмСщСния. Если Π±Ρ‹ Ρƒ класса hasY отсутствовало объявлСниС конструктора пСрСмСщСния, Ρ‚ΠΎ компилятор Π½Π΅ синтСзировал Π±Ρ‹ конструктор пСрСмСщСния Π²ΠΎΠΎΠ±Ρ‰Π΅. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСмСщСния Π½Π΅ ΡΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ, Ссли Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅.

И послСднСС Π²Π·Π°ΠΈΠΌΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ функциями пСрСмСщСния ΠΈ синтСзируСмыми функциями-Ρ‡Π»Π΅Π½Π°ΠΌΠΈ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ: Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, опрСдСляСт Π»ΠΈ класс собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСмСщСния, влияСт Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΡΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ копирования. Если класс ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ любой конструктор пСрСмСщСния ΠΈ (ΠΈΠ»ΠΈ) ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ, Ρ‚ΠΎ синтСзируСмый конструктор ΠΊΠΎΠΏΠΈΠΉ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ для этого класса Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅.

ΠšΠ»Π°ΡΡΡ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ конструктор пСрСмСщСния ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ копирования. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ.

R-значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ, Π° l-значСния ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡβ€¦

Когда Ρƒ класса Π΅ΡΡ‚ΡŒ ΠΈ конструктор пСрСмСщСния ΠΈ конструктор ΠΊΠΎΠΏΠΈΠΉ, компилятор ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· конструкторов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ (см. Ρ€Π°Π·Π΄Π΅Π» 6.4). Π‘ присвоСниСм Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅. НапримСр, Π² классС StrVec вСрсия копирования ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ссылку Π½Π° const StrVec. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΎΠ½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ классу StrVec. ВСрсия пСрСмСщСния ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ StrVec&& ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ r-значСниям (нСконстантным):

StrVec v1, v2;

v1 = v2;                  // v2 - l-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅; присвоСниС ΠΊΠΎΠΏΠΈΠΈ

StrVec getVec(istream &); // getVec Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ r-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

v2 = getVec(cin);         // getVec(cin) - r-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅;

                          // присвоСниС пСрСмСщСния

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ присвоСния пСрСдаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ v2. Π•Π³ΠΎ Ρ‚ΠΈΠΏΠΎΠΌ являСтся StrVec, Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ v2 являСтся l-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. ВСрсия присвоСния ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π½Π΅ являСтся подходящСй (см. Ρ€Π°Π·Π΄Π΅Π» 6.6), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСльзя нСявно ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ссылку Π½Π° r-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с l-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π² этом случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ.

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС присваиваСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getVec(), β€” это r-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ подходящими ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния β€” Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getVec() ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ с Π»ΡŽΠ±Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Π’Ρ‹Π·ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присвоСния ΠΊΠΎΠΏΠΈΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ прСобразования Π² константу, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ StrVec&& обСспСчиваСт Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ соотвСтствиС. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π²Ρ‚ΠΎΡ€ΠΎΠ΅ присвоСниС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ.