N4189で提案されているUnique Resourceが便利そうなので、簡易版を自ソフトへ取り込もうとしています。
この資料の16ページ 8.2 Unique Resourceに実装例が記載されているのですが、何か変です。
####疑問①
C++
1template<typename R,typename D> 2class unique_resource{ 3 R resource; 4 D deleter; 5 bool execute_on_destruction; // exposition only 6 7(中略) 8 9// construction 10explicit 11unique_resource(R && resource, D && deleter, bool shouldrun=true) noexcept 12 : resource(std::move(resource)) 13 , deleter(std::move(deleter)) 14 , execute_on_destruction{shouldrun}{} 15 16(中略) 17 18//factories 19template<typename R,typename D> 20auto 21make_unique_resource( R && r,D &&d) noexcept { 22return unique_resource<R,std::remove_reference_t<D>>( 23 std::move(r) 24 ,std::forward<std::remove_reference_t<D>>(d) 25 ,true); 26}
となっているのですが、std::move()しているためresourceに参照を渡せないように思います。
実験
普通に名前付きインスタンス(std::vector<unsigned> foo;のfoo)をfactoryに渡したところ、msvc 2015ではstd::move()のままでも通ったのですが、MinGW 5.2.0ではエラーになりました。
error: invalid initialization of non-const reference of type 'std::vector<unsigned int>&' from an rvalue of type 'std::remove_reference<std::vector<unsigned int>&>::type {aka std::vector<unsigned int>}'
そして、std::forward<>へ変更することでビルドと実行できるようになりました。
これは実装例のミスと考えて間違いないでしょうか?
私自身のstd::forwardの理解が浅いのでいまいち確信が持てないのです。
####疑問②
次に、factoryでremove_reference<D>されていますが、この必要性が分かりません。
実験
remove_reference_t<D>が2箇所にあります。このままでも動作するのですが、両方ともremove_reference_t<>をやめて、ラムダ式を与えてみたところ問題なく動作しました。
このremove_reference_t<>は不要と考えて間違いないでしょうか?
意味もなくコードが複雑になるのは好ましくないので、不要なら削除しようと思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/27 07:03 編集