ユニヴァーサル参照の引数を持つ関数内で、その引数を別の関数に渡すときに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