[解決済み] std::moveとstd::forwardの違いは何ですか?
2022-04-20 07:09:06
質問
こちらで拝見しました。 ベースクラスの Move コンストラクタを呼び出す Move コンストラクタ
どなたか説明してください。
-
かわり
std::move
とstd::forward
できればコード例も一緒に教えてください。 - 簡単に考える方法と、どのタイミングでどれを使うか
解決するには?
std::move
はオブジェクトを受け取り、それを一時的なもの(rvalue)として扱えるようにします。意味上の必要条件ではありませんが、通常、rvalueへの参照を受け入れる関数はそれを無効にします。あなたが
std::move
しかし、新しい値を代入して使い続けることは可能です。
std::forward
それは、テンプレート化された関数パラメータ(関数内部)を、呼び出し元が渡すために使用した値のカテゴリ(lvalueまたはrvalue)にキャストすることです。これにより、rvalueの引数はrvalueとして渡され、lvalueはlvalueとして渡されるようになり、完璧な転送と呼ばれるスキームが実現します。
への 例える :
void overloaded( int const &arg ) { std::cout << "by lvalue\n"; }
void overloaded( int && arg ) { std::cout << "by rvalue\n"; }
template< typename t >
/* "t &&" with "t" being template param is special, and adjusts "t" to be
(for example) "int &" or non-ref "int" so std::forward knows what to do. */
void forwarding( t && arg ) {
std::cout << "via std::forward: ";
overloaded( std::forward< t >( arg ) );
std::cout << "via std::move: ";
overloaded( std::move( arg ) ); // conceptually this would invalidate arg
std::cout << "by simple passing: ";
overloaded( arg );
}
int main() {
std::cout << "initial caller passes rvalue:\n";
forwarding( 5 );
std::cout << "initial caller passes lvalue:\n";
int x = 5;
forwarding( x );
}
Howardが言うように、これらの関数は単に参照型にキャストするだけなので、類似点もあります。しかし、これらの特定の使用例(rvalueの参照キャストの有用性の99.9%をカバーする)以外では、以下のように使用すべきです。
static_cast
を直接書いて、何をやっているのかきちんと説明しましょう。
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] g++とgccの違いは何ですか?
-
[解決済み] std::move()とは何ですか?また、どのような場合に使用するのですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] std::forwardはどのように機能するのですか?重複] [重複
-
[解決済み] std::forwardを使用して引数を転送するタイミングは?
-
[解決済み] 移動したオブジェクトはどうすればいいですか?