右辺値参照のムーブも共に使って、可変長引数テンプレートを forward する2020年03月04日 13時18分41秒

C++11 でもう一つ導入された強力なのが、右辺値参照。既に出て、十年近く経過しているので、新しい話題ではないが、可変長引数テンプレートと組み合わせると、更に強力。

右辺値参照は簡単にまとめると、以前は、一時変数を生成してから更にコピーしていたのを、使いきりの一時変数であれば、一時変数をそのまま複製しないで使う機能。その為、余計なコピーコンストラクタを防ぐ事が出来る。

この二つを組み合わせると 可変長引数テンプレート 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
実行結果は前回と同じ。

前回。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2020/03/04/9220585/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。