forward

ユニヴァーサル参照の引数を持つ関数内で、その引数を別の関数に渡すときにmoveしてしまうと、ユニヴァーサル参照が左辺値だった場合に困る場合がある。

右辺値参照・ムーブセマンティクス - cpprefjp C++日本語リファレンス

このような場合に、

forward - cpprefjp C++日本語リファレンス

forwardが役に立つ。

custom_string.hに、

と書いて、

custom_string.cppに、

と書く。

main.cppは、

と書く。

func, func2, func3はユニヴァーサル参照、funcの中ではそのまま、func2の中ではsfd::move経由、func3の中ではstd::forward経由で渡してる。
外側でそれぞれの関数にそのまま渡す場合と、std::moveで渡す場合を試す。

$ vi main.cpp 
$ ./main 
str1 = ABCDE
str2 = VWXYZ
str1 ptr = 0x0083cc20
obj ptr = 0x0083cc20
ABCDE
inner_str ptr = 0x0083d0b0
str2 ptr = 0x0083cc40
obj ptr = 0x0083cc40
VWXYZ
inner_str ptr = 0x0083d0b0

obj ptr = 0x0083cc20
ABCDE
inner_str ptr = 0x0083cc20
obj ptr = 0x0083cc40
VWXYZ
inner_str ptr = 0x0083cc40
str1 ptr = 0x00000000
str2 ptr = 0x00000000

str3 ptr = 0x0083cc60
obj ptr = 0x0083cc60
ABCDE
inner_str ptr = 0x0083cc40
str4 ptr = 0x0083cc80
obj ptr = 0x0083cc80
VWXYZ
inner_str ptr = 0x0083cc80
str3 ptr = 0x0083cc60
str4 ptr = 0x00000000
$

str3は左辺値なのでちゃんと残っているし、str4は右辺値なので破棄されている。

Sample/cpp/forward/forward/src/forward at master · bg1bgst333/Sample · GitHub