std::forward による引数の転送
C 0x では、std::forward は引数を別の関数呼び出しに転送するために使用されます。これは、引数を明示的にコピーまたは移動する必要を避けたい場合に有利です。
std::forward の使用には、関数パラメーターでの &&& 表記の使用が含まれます。この表記法を使用すると、左辺値参照と右辺値参照の両方を引数として受け入れることができます。
次の例では:
<code class="cpp">template<class T> void foo(T&&& arg) { bar(std::forward<T>(arg)); }</code>
std::forward
ただし、すべての場合に std::forward を使用する必要はありません。これは、引数の参照型を保持する必要がある場合にのみ必要です。たとえば、右辺値参照を受け取らない関数がある場合は、std::forward を使用しないでください。
次の例では、
<code class="cpp">template<int val, typename... Params> void doSomething(Params... args) { doSomethingElse<val, Params...>(args...); }</code>
を使用する必要はありません。 doSomethingElse 関数は左辺値または右辺値参照を取ることができるため、std::forward を使用します。
ただし、右辺値参照を取る関数がある場合は、引数が右辺値として転送されるように std::forward を使用する必要があります。参考文献。例:
<code class="cpp">template<int val, typename... Params> void doSomething(Params&&... args) { doSomethingElse<val, Params...>(std::forward<Params>(args)...); }</code>
この例では、引数が最初は左辺値参照であっても、引数が右辺値参照として転送されるようにするために std::forward が使用されています。
最後に、引数を複数回転送しないでください。これにより、未定義の動作が発生する可能性があります。たとえば、次のコードは正しくありません:
<code class="cpp">template<int val, typename... Params> void doSomething(Params&&... args) { doSomethingElse<val, Params...>(std::forward<Params>(args)...); doSomethingWeird<val, Params...>(std::forward<Params>(args)...); }</code>
この例では、引数が 2 回転送されるため、未定義の動作が発生する可能性があります。
以上が## C で std::forward を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。