前提
パラメータパックの中でユニバーサル参照を使ったのですが,完全転送される引数と,そうでない引数があり,期待した動作になりません。
実現したいこと
右辺値パラメータについてムーブされ,左辺値については参照として動作するように,普通の理解のように動作させたい。コードに間違いがあれば,改善方法を含めてご教示願えませんでしょうか。
発生している問題
以下のコードで,なぜか2つ目のパラメータがムーブされない。これはC++本来の動作なのか,それともコーディングにミスがあるのかがわからない・
該当のソースコード
C++
1template<typename M,typename ...Args> 2void func(M&& r, Args&&...args ){ 3 std::vector<int> m = std::forward< M >(r); 4 5 if constexpr( sizeof...(Args) == 0 ) 6 return; 7 else 8 func( args... ); 9} 10 11int main(){ 12 std::vector<int> n{1,2}; 13 std::vector<int> m{2,3}; 14 15 std::cout << "before\n";; 16 std::cout << "n:" << n.size() << '\n'; 17 std::cout << "m:" << m.size() << '\n'; 18 19 func(std::move(n),std::move(m)); 20 21 std::cout << "after\n";; 22 std::cout << "n:" << n.size() << '\n'; 23 std::cout << "m:" << m.size() << '\n'; 24} 25 26//before 27//n:2 28//m:2 29//after 30//n:0 31//m:2 32//2つ目もムーブされているならば,m:0 になるはず 33
補足情報(FW/ツールのバージョンなど)
clang
C++17
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/28 03:46