
|
293
8 章
もう一ひねり
C++ の汎用的な技法や機能に共通して言えることですが、使用するにふさわしい場面もあれば、ふ
さわしくない場面もあります。汎用的な技法や機能が有用である場面の解説は通常きわめて直観的
で分かりやすいものですが、本章では分かりにくいものを 2 つとりあげます。汎用技法としての値
渡しと、汎用機能としての直接配置(emplacement)です。これらを使用するにふさわしいか否か
を判断するには、多くの要因が関係します。著者から言える最も良い助言はその使用を熟慮せよ、
です。そうは言っても、この 2 つは効率的かつ現代の C++ プログラミング(effective modern C++
programming)で重要な役割を担いますから、読者のソフトウェア開発現場でのこの 2 つの使用が
適切か否かを判断する目安をここで述べます。
項目 41:コピー可能仮引数のムーブコストが安く、かつ常にコピー
する場面では値渡しを検討する
関数仮引数にはコピーを想定したものもあります1。例えば、addName というメンバ関数が、その
仮引数をローカルなコンテナにコピーするとします。効率を考えれば、このような関数では実引数
が左辺値ならばコピー、右辺値ならばムーブするべきです。
class Widget {
public: 左辺値を受け取る
void addName(const std::string& newName) // take lvalue;
{ names.push_back(newName); ...