右辺値参照は簡単にまとめると、以前は、一時変数を生成してから更にコピーしていたのを、使いきりの一時変数であれば、一時変数をそのまま複製しないで使う機能。その為、余計なコピーコンストラクタを防ぐ事が出来る。
この二つを組み合わせると [LINK]可変長引数テンプレート Variadic Template を Parameter Pack して forward したものを、わざわざ unique_ptr を使わなくても、良くなる。
#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' );
}
これで、一時変数を作り、cout で表示して、そのまま返せる。明示的に std::move を置いたが、これも必要ない用で、処理系で自動で move もするように最適化するらしい。
% c++ -std=c++11 emplace-move.cpp
% ./a.out
3.14
3
aaa
実行結果は前回と同じ。
[LINK]前回。
セコメントをする