成员函数的{std :: forward和ref-qualifiers

时间:2016-10-29 20:36:56

标签: c++ c++11 templates c++14 perfect-forwarding

无论我在哪里有转发参考,我都处在std::forward的位置,我想知道其中一些是不必要的甚至是错误的。例如,在std::forward电话中有std::begin()

由于类能够根据是否将对象作为右值调用而不是https://akrzemi1.wordpress.com/2014/06/02/ref-qualifiers/来重载其成员函数,我假设模板化函数尽可能高效如果你知道你转发对象的内部函数是非变异的和/或是对象的成员函数。例如

template <typename Something>
void do_something(Something&& something) {
    std::forward<Something>(something).do_something();
    auto iter = std::begin(std::forward<Something>(something));
    for_each(iter, std::end(std::forward<Something>(something), []() {});
}

我看到了这个问题(When not to use std::forward with r-values?),但它没有解决成员函数引用限定符,也没有明确说明当你无法访问内部函数时的最佳实践您正在调用的定义。

是否有关于何时不使用std::forward来解决我提到的问题的一般准则?或者是否有一些我遗漏的关键概念?

2 个答案:

答案 0 :(得分:1)

除非你知道你将拥有的类型,否则请避免在同一个函数中多次使用std::forward同一个对象,第二次,你的对象可能会被移动。

// assuming implementation which really need pass by value instead of const reference
template <typename T> void pass_by_value(T t) { std::cout << t; }

template <typename T>
void foo(T&& t)
{
    pass_by_value(std::forward<T>(t));
    pass_by_value(std::forward<T>(t));
}

foostd::string

的来电
foo(std::string("Hello world")); // or "Hello world"s

可能会调用等效于

    pass_by_value(std::string("Hello world"));
    pass_by_value(std::string("")); // Moved string...

答案 1 :(得分:0)

问题是在物体移动后使用(&#34; stealed&#34;)。如果在something的多行中使用do_something,则仅在最后一行使用std::forward以防止出现问题。