使用 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>
您不需要使用std::forward 因为 doSomethingElse 函数可以接受左值或右值引用。
但是,如果您有一个接受右值引用的函数,则应该使用 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>
在此示例中,参数被转发两次,这可能会导致未定义的行为。
以上是## 我什么时候应该在 C 中使用 std::forward ?的详细内容。更多信息请关注PHP中文网其他相关文章!