右辺値参照のムーブも共に使って、可変長引数テンプレートを forward する ― 2020年03月04日 13時18分41秒
右辺値参照は簡単にまとめると、以前は、一時変数を生成してから更にコピーしていたのを、使いきりの一時変数であれば、一時変数をそのまま複製しないで使う機能。その為、余計なコピーコンストラクタを防ぐ事が出来る。
この二つを組み合わせると 可変長引数テンプレート Variadic Template を Parameter Pack して forward したものを、わざわざ unique_ptr を使わなくても、良くなる。
これで、一時変数を作り、cout で表示して、そのまま返せる。明示的に std::move を置いたが、これも必要ない用で、処理系で自動で move もするように最適化するらしい。
#include <iostream>
template< typename T, typename... Ts >
T emplace( Ts&&... args )
{
T value( std::forward< Ts >( args )... );
std::cout << value << std::endl;
return std::move( value );
}
int main()
{
float f = emplace< float >( 3.14 );
int i = emplace< int >( 3.14 );
std::string s = emplace< std::string >( 3, 'a' );
}
実行結果は前回と同じ。
% c++ -std=c++11 emplace-move.cpp
% ./a.out
3.14
3
aaa
コメント
トラックバック
このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2020/03/04/9220585/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。