Π§ΡΠΎ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΏΡΠΎΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ?
ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ΡΠΈΡΠ°ΡΠ΅Π»Ρ Π·Π½Π°ΠΊΠΎΠΌ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠ΅ΠΉ ΡΡΡΠ»ΠΎΠΊ Π² C++, ΠΊΠ»Π°ΡΡΠΎΠ², ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ², ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ² ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎΠΌ ΡΡΡΡ .
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ rvalue ΠΈ lvalue
ΠΠ°ΠΆΠ΄ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² C++ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΠ·ΡΠ΅ΡΡΡ Π΄Π²ΡΠΌΡ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌΠΈ: ΡΠΈΠΏΠΎΠΌ ΠΈ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠ΅ΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΡ (value category [1]). Π ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΡΠ°Π·Π±ΠΎΡΠ° move semantics Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅. ΠΠΎΠ»Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ β ΡΠ΅ΠΌΠ° Π΄Π»Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΌΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ.
Π‘ΡΠ°Π½Π΄Π°ΡΡ ΡΠ·ΡΠΊΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΡΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈ Π΅ΡΡ Π΄Π²Π΅ ΡΠΎΡΡΠ°Π²Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΠ΅ΡΠ²ΡΡ ΡΡΡΡ .
ΠΠ°Π·ΠΎΠ²ΡΠΌΠΈ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠ²Π»ΡΡΡΡΡ lvalue, prvalue ΠΈ xvalue:
- lvalue [2] (ΠΎΡ left-hand value β Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π²Π° ΠΎΡ ΡΠ°Π²Π½ΠΎ) β ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΡ, ΡΠ΅ΠΌΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ°Π·ΡΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°Π½ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, ΡΡΡΠ»ΠΊΠ°.
- prvalue [3] (ΠΎΡ pure rvalue) β Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ»ΠΈ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°Π½Π΄, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ, Π½Π΅ ΡΠ²Π»ΡΡΡΠΈΠΉΡΡ ΡΡΡΠ»ΠΊΠΎΠΉ, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΡΡΡΠΈΠΊΡΠ½ΡΡ
ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ° ΠΈΠ»ΠΈ Π΄Π΅ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ.
- xvalue [4] (ΠΎΡ expiring value) β ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±Π»ΠΈΠ·ΠΊΠΈ ΠΊ ΠΊΠΎΠ½ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ (lifetime [5]). Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ xvalue β ΡΡΠΎ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ Π½Π° rvalue (ΠΎ ΡΡΡΠ»ΠΊΠ°Ρ Π½Π° rvalue β ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅), Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΉ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΡ ΡΡΡΠ»ΠΊΠΈ Π½Π° rvalue.
ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ² ΡΡΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π΄Π²Π΅ ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ (ΡΠΎΡΡΠ°Π²Π½ΡΠ΅) β glvalue ΠΈ rvalue:
- glvalue [6] (ΠΎΡ generalized lvalue) β Π»ΠΈΠ±ΠΎ lvalue, Π»ΠΈΠ±ΠΎ xvalue.
- rvalue [7] (ΠΎΡ right-hand value β Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΏΡΠ°Π²Π° ΠΎΡ ΡΠ°Π²Π½ΠΎ) β Π»ΠΈΠ±ΠΎ prvalue, Π»ΠΈΠ±ΠΎ xvalue.
ΠΠ»Ρ ΡΡΠ½ΠΎΡΡΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π²Π·Π³Π»ΡΠ½ΡΡΡ Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ ΠΠ΅Π½Π½Π°:
ΠΠΎ C++ 11 ΠΌΡ ΠΈΠΌΠ΅Π»ΠΈ Π»ΠΈΡΡ lvalue ΠΈ rvalue, Π° ΠΏΠΎΡΠ»Π΅ β rvalue ΡΠ°Π·Π΄Π΅Π»ΠΈΠ»ΠΈ Π½Π° Π΄Π²Π° Π²ΠΈΠ΄Π°: xvalue ΠΈ prvalue, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΡΠΎΠ²ΠΎΠΊΡΠΏΠ½ΠΎΡΡΡ xvalue ΠΈ lvalue ΡΡΠ°Π»ΠΈ Π½Π°Π·ΡΠ²Π°ΡΡ glvalue.
ΠΡΡΠ±ΠΎ Π³ΠΎΠ²ΠΎΡΡ, lvalue β Π²ΡΡ, ΡΠ΅ΠΌΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ²Π½ΠΎ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. rvalue β ΡΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π½Π΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Π½ΠΈ Ρ ΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ; ΡΡΠΎ-ΡΠΎ Π²ΠΈΡΠ°ΡΡΠ΅Π΅ Π² Π²ΠΎΠ·Π΄ΡΡ Π΅ ΠΈ Π½ΠΈ Π·Π° ΡΠ΅ΠΌ Π½Π΅ Π·Π°ΠΊΡΠ΅ΠΏΠ»ΡΠ½Π½ΠΎΠ΅.
Π‘ΡΡΠ»ΠΊΠΈ Π½Π° rvalue
ΠΡΡΠ°Π²ΠΈΠ² ΡΠ°ΠΌΠΎΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎΠ΅ ΠΏΠΎΠ·Π°Π΄ΠΈ, ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ Π±ΠΎΠ»Π΅Π΅ Π±Π»ΠΈΠ·ΠΊΠΈΡ ΠΊ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Π²Π΅ΡΠ°Ρ , ΠΎ ΡΡΡΠ»ΠΊΠ°Ρ Π½Π° rvalue.
ΠΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° C++ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ°ΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ΄Π° Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ (rvalue). ΠΠΎ C++ 11 ΠΌΡ Π½Π΅ ΠΈΠΌΠ΅Π»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄Π»Ρ Π±ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° Π½ΠΈΡ (Π²Π΅ΡΠ½Π΅Π΅, ΠΌΠΎΠ³Π»ΠΈ, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ, Π° Π·Π½Π°ΡΠΈΡ, Π»ΠΈΡΠ°ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ).
Π‘ ΠΏΡΠΈΡ ΠΎΠ΄ΠΎΠΌ C++ 11 Π²ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ: ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° rvalue (ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ rvalue ΡΠ΅ΡΠ΅Π· ΡΡΠΈ ΡΡΡΠ»ΠΊΠΈ) ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ Π΄ΠΎ ΡΡΠΎΠ³ΠΎ ΡΡΡΠ»Π°Π»ΠΈΡΡ Π½Π° lvalue (ΠΊΡΡΠ°ΡΠΈ Π³ΠΎΠ²ΠΎΡΡ, ΡΠΎ, ΡΡΠΎ Π² C++ ΠΌΡ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ»ΠΊΠ°ΠΌΠΈ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΡΠ»ΠΊΠ°ΠΌΠΈ Π½Π° lvalue). ΠΡΠ΅ΠΌΡ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
- 1-Ρ ΡΡΡΠΎΠΊΠ° main, Π±ΡΠ΄Ρ ΠΎΠ½Π° ΡΠ°ΡΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π°, Π½Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π»Π°ΡΡ Π±Ρ, Ρ.ΠΊ. Π‘ΡΠ°Π½Π΄Π°ΡΡ Π·Π°ΠΏΡΠ΅ΡΠ°Π΅Ρ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ (rvalue) ΠΊ ΡΡΡΠ»ΠΊΠ°ΠΌ Π½Π° lvalue. ΠΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°ΡΡ rvalue ΠΊ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΌ ΡΡΡΠ»ΠΊΠ°ΠΌ Π½Π° lvalue, ΡΡΠΎ ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΠΎ 2-ΠΉ ΡΡΡΠΎΠΊΠ΅. ΠΠΎ Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΌΠΈ ΡΡΡΠ»ΠΊΠ°ΠΌΠΈ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°: ΠΎΠ½ΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠ΅! ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½ΠΈΡΠ΅Π³ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΡΠΌ rvalue, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ°ΠΊΡΡ ΡΡΡΠ»ΠΊΡ, ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ 3-Ρ ΡΡΡΠΎΠΊΠ°.
- 4-Ρ ΡΡΡΠΎΠΊΠ° Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠΎΠΌ β Π΄Π²ΡΠΌΡ Π°ΠΌΠΏΠ΅ΡΡΠ°Π½Π΄Π°ΠΌΠΈ (
&&
), ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡΠΈΠΌΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ Π½Π° rvalue [8]. ΠΠ°Π»Π΅Π΅ ΠΊ ΡΡΠΎΠΉ ΡΡΡΠ»ΠΊΠ΅ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ rvalue, ΠΊΠΎΡΠΎΡΠΎΠ΅, ΠΊΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· 5-ΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ.
ΠΠ°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ ΡΠ°ΠΌΠ° ΡΡΡΠ»ΠΊΠ° Π½Π° rvalue ΡΠ²Π»ΡΠ΅ΡΡΡ lvalue.
ΠΡΠΎ Π²ΡΡ ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠΎ, ΡΠΊΠ°ΠΆΠ΅ΡΠ΅ Π²Ρ, Π½ΠΎ ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΌΠ½Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΎΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ? ΠΠ± ΡΡΠΎΠΌ β Π½ΠΈΠΆΠ΅.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ move semantics ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΡΠΎ
ΠΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π°Ρ ΠΊΠ»Π°ΡΡ X ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° int.
resource
Π·Π΄Π΅ΡΡ β ΡΡΠΎ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅, Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΡΡΠΆΠ΅Π»ΠΎ ΠΈ Π΄ΠΎΠ»Π³ΠΎ ΠΊΠΎΠΏΠΈΡΡΡΡΡΡ ΠΈ Π»ΠΈΡΠ½Π΅Π³ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΡΠΎΡΡΡ
ΡΡΠΎΠΈΡ ΠΈΠ·Π±Π΅Π³Π°ΡΡ.
ΠΠ°ΠΌΠ΅Π½ΠΈΠΌ main
ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 1 Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ:
ΠΠ°ΠΌΠ΅ΡΠΈΠ»ΠΈ, Π΄Π°? ΠΡ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ, ΠΏΡΠΎΡΡΠΎ Π·Π°Π±ΡΠ°Π² (ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠ²) ΡΠ΅ΡΡΡΡ ΠΈΠ· Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Ρ.ΠΊ. ΡΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΎΡΠ΅Π½Ρ ΡΠΊΠΎΡΠΎ (ΠΏΠΎΡΠ»Π΅ Π²ΡΡ ΠΎΠ΄Π° ΠΈΠ· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ) Π±ΡΠ΄Π΅Ρ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ ΠΈ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΏΠΎΡΡΡΠ°Π΄Π°Π΅Ρ, Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΡΠ°Π½Π΅Ρ ΠΏΡΡΡΡΠΌ (ΠΈΠ»ΠΈ Π½Π΅ ΠΏΡΡΡΡΠΌ, Π½ΠΎ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΡΠΌ). ΠΡΠΎ ΠΈ Π΅ΡΡΡ move semantics.
ΠΠ°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ move semantics Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°. Move semantics β ΡΡΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΡΠ»ΡΡΠ°ΡΡ . ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΡΠΎ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΠΎΠ±ΡΡΡ ΡΠΊΠΎΡΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΡΠΎ Π²ΡΡ Π·Π²ΡΡΠΈΡ ΠΏΡΠΈΠ²Π»Π΅ΠΊΠ°ΡΠ΅Π»ΡΠ½ΠΎ, Π½ΠΎ ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ? ΠΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡβ¦
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ
Π‘++ 11 Π΄Π°Π» Π½Π°ΠΌ Π΄Π²Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ move semantics Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ
ΠΊΠ»Π°ΡΡΠ°Ρ
β ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ. ΠΡΠΎ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠ΄Π° Π°Π½Π°Π»ΠΎΠ³ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π½ΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠ΅ Π½Π΅ Π΄Π»Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π° Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ. ΠΠΎΠ±Π°Π²ΠΈΠΌ ΠΈΡ
Π² Π½Π°Ρ ΠΊΠ»Π°ΡΡ X
:
Π ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ΅ΡΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π² ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΠΌ, ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π½Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ΅ΡΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΠΌ, ΠΈ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ. Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΡΠΆΠ΅Π»ΠΎΠ²Π΅ΡΠ½ΡΠΉ ΡΠ΅ΡΡΡΡ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ!
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ΅Π³ΠΎ C++ 11, ΠΊΠΎΠ΄ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 3 Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π° Π²ΠΌΠ΅ΡΡΠΎ Π½Π΅Π³ΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ. ΠΠΎΡΠ΅ΠΌΡ? ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΏΡΠ°Π²Π° ΠΎΡ Π·Π½Π°ΠΊΠ° ΡΠ°Π²Π½ΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ rvalue, Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ rvalue.
Π Π΅Π·ΡΠΌΠΈΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΠ΅ ΡΠ°Π·Π΄Π΅Π»Π° ΡΡΠ°ΡΡΠΈ:
- C++ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΎΡΠ»ΠΈΡΠ°ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΎΡ Π½Π΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ (rvalue ΠΎΡ lvalue);
- ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΡΡΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ;
- Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΈΡ
Π΄Π»Ρ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, C++ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π»ΠΈΠ±ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ, Π² ΠΊΠΎΡΠΎΡΡΡ
ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π΅Π»Π°ΡΡ, ΡΡΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°Π±ΠΈΡΠ°ΡΡ ΡΠ΅ΡΡΡΡΡ Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, βΠ»ΠΎΠΌΠ°Ρβ ΠΈ βΠΏΠΎΡΡΡβ Π΅Π³ΠΎ, Π½ΠΎ ΠΈΠ·Π±Π΅Π³Π°Ρ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ. βΠΡΠΏΠΎΡΡΠ΅Π½Π½ΡΠΉβ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π΅Π»Π°Π΅Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π» Π±Ρ ΠΈ Π½Π΅ Π±ΡΠ΄Ρ ΠΎΠ½ βΠΈΡΠΏΠΎΡΡΠ΅Π½Π½ΡΠΌβ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ β ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅ΡΡΡ (Π½Π° ΡΠΎ ΠΎΠ½ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ).
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ ΠΊΠ°ΠΊ noexcept
.
Π‘ΡΠΎΠΈΡ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠ΅ ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΡΡΡ , ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΠΎΠΌ ΠΏΡΡΠΈ [9]: Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΠ΅ Π² Π²Π°ΡΠ΅ΠΌ ΠΊΠ»Π°ΡΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠ½ΠΊΡ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠ°, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΠΏΡΡΡ:
- ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ;
- ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ;
- ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ;
- ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ;
- Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ.
ΠΠ½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΈΡΠ°ΡΠ΅Π»Ρ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ° Π·Π°Π΄Π°Π»ΡΡ Π²ΠΎΠΏΡΠΎΡΠΎΠΌ, ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ, Π΅ΡΠ»ΠΈ ΠΊΠ»Π°ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠΎΠ»Ρ Π½Π΅ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, std::string
), Π½Π΅ ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ, Π²Π΅Π΄Ρ Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ std::swap
ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅*. ΠΠ»Ρ ΡΠ°ΠΊΠΈΡ
ΡΠΈΡΡΠ°ΡΠΈΠΉ Π‘++11 ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π½Π°ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡβ¦
std::move
std::move
[11] β ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½Π°Ρ Π² Ρ
Π΅Π΄Π΅ΡΠ΅ <utility>
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π·ΡΡΡ, ΡΡΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, lvalue), ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈΠ· ΡΡΠΎΠ³ΠΎ rvalue (xvalue, Π΅ΡΠ»ΠΈ Π±ΡΡΡ ΡΠΎΡΠ½ΡΠΌ).
ΠΡΡΡΠΎ... Π ΡΡΠΎ ΡΡΠΎ Π½Π°ΠΌ Π΄Π°ΡΡ? ΠΡΠΎ Π΄Π°ΡΡ Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ, rvalue-ΡΡΡΠ»ΠΎΠΊ Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ Ρ Π½Π°Ρ Π½Π΅Ρ.
ΠΠΎΠΏΡΡΡΠΈΠΌ, Π½Π°Ρ ΠΊΠ»Π°ΡΡ X ΠΈΠΌΠ΅Π΅Ρ ΠΏΠΎΠ»Π΅ ΡΠΈΠΏΠ° std::string
. ΠΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ?
Π’Π΅ΠΏΠ΅ΡΡ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ»Ρ ΡΠΈΠΏΠ° std::string
(stringField
) Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° std::string
, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²ΡΠ·ΠΎΠ² std::move
βΡΠ΄Π΅Π»Π°Π»β ΠΈΠ· x.stringField
rvalue! Π ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ stringField
Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ std::string
, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²ΡΠ·ΠΎΠ² std::move
βΡΠ΄Π΅Π»Π°Π»β ΠΈΠ· x.stringField
rvalue.
Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠΈ, ΠΎΠ±ΡΡΡΠΊΠ° Π² std::move
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠΌΠ΅ΡΠΈΡΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΡΠΈ ΡΠ΅ΡΡΡΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½Ρ.
std::move
ΡΠ°ΠΊΠΆΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΡΠΎΠ²ΠΎΠΊΡΠΏΠ½ΠΎΡΡΠΈ Ρ ΡΠΌΠ½ΡΠΌΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ (std::unique_ptr
), ΠΎ ΠΊΠΎΡΠΎΡΡΡ
ΠΌΡ ΡΠΎΠΆΠ΅ ΠΏΠΈΡΠ°Π»ΠΈ.
std::swap
ΡΠΎΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ std::move
.ΠΡΠ²ΠΎΠ΄
Move semantics ΠΏΡΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈΡΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΡΠ»ΡΡΠ°ΡΡ . Move semantics ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π±ΠΈΡΠ°ΡΡ ΡΠ΅ΡΡΡΡΡ Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π² ΡΠΊΠΎΡΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π±ΡΠ΄ΡΡ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½Ρ, ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΈΠ·Π±Π΅Π³Π°Ρ Π»ΠΈΡΠ½Π΅Π³ΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠ½ΠΎΠ²Π½ΡΠΌΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΡΠ·ΡΠΊΠ° ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ move semantics ΡΠ²Π»ΡΡΡΡΡ:
- ΡΡΡΠ»ΠΊΠΈ Π½Π° rvalue;
- ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ;
std::move
.
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ rvalue, ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ β ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ rvalue. std::move
ΠΎΡΠΌΠ΅ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΡΠ΅ΡΡΡΡΡ ΠΊΠΎΡΠΎΡΡΡ
ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½Ρ, ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Ρ ΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² rvalue (xvalue).
std::forward
[12], ΡΠ΅ΠΌΠ° copy/move elision ΠΈ RVO [13], Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ½ΠΊΠ°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ C++ β ref-qualified ΠΌΠ΅ΡΠΎΠ΄Ρ [14].ΠΡΡΠΎΡΠ½ΠΈΠΊΠΈ
- https://en.cppreference.com/w/cpp/language/value_category
- https://en.cppreference.com/w/cpp/language/value_category#lvalue
- https://en.cppreference.com/w/cpp/language/value_category#prvalue
- https://en.cppreference.com/w/cpp/language/value_category#xvalue
- https://en.cppreference.com/w/cpp/language/lifetime
- https://en.cppreference.com/w/cpp/language/value_category#glvalue
- https://en.cppreference.com/w/cpp/language/value_category#rvalue
- https://en.cppreference.com/w/cpp/language/reference#Rvalue_references
- https://en.cppreference.com/w/cpp/language/rule_of_three
- https://stackoverflow.com/a/3279550/11681638
- https://en.cppreference.com/w/cpp/utility/move
- https://en.cppreference.com/w/cpp/utility/forward
- https://en.cppreference.com/w/cpp/language/copy_elision#:~:text=When%20copy%20elision%20occurs%2C%20the
- have%20been%20destroyed%20without%20the
- https://en.cppreference.com/w/cpp/language/member_functions
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ