
180
|
5 章 右辺値参照、ムーブセマンティクス、完全転送
このことは、値戻しをする関数内で戻り値となるローカルオブジェクトを std::move すると、コ
ンパイラを手助けすることにはならず(コンパイラは、コピーを省略しない場合、このローカルオ
ブジェクトを右辺値として扱わなければならない)、逆に間違いなく妨げになることを意味します
(RVO を妨げる)。ローカルオブジェクトを std::move するのが適切な場面もありますが(今後使
わないことが確実なローカルオブジェクトを関数に渡す場合)、return 文の一部として RVO 不可能
な場面や、値を渡した仮引数を返す場合は、適切ではありません。
重要ポイント
•
std::move は右辺値参照に対し、また std::forward は最後に使用するユニヴァーサル参照
に対し、それぞれ実行する。
•
値戻しする関数から返す右辺値参照、ユニヴァーサル参照についても同様のことが言える。
•
戻り値の最適化にそぐわないローカルオブジェクトに対し、std::move や std::forward を
実行してはいけない。
項目 26:ユニヴァーサル参照をとるオーバロードは避ける
仮引数に名前をとり、日付と時刻をログ出力し、名前をグローバルデータに追加する関数を開発
するとしましょう。まず浮かぶのは次のような関数でしょう。
std::multiset<std::string> names; // global data structure
グローバルデータ
void