6

次の 2 つを検討してください。

template <class Function>
void apply(Function&& function)
{
    std::forward<Function>(function)();
}

template <class Function>
void apply(Function&& function)
{
    function();
}

どのような場合に違いがあり、具体的にどのような違いがあるのでしょうか?

4

1 に答える 1

12

に ref 修飾子がFunctionある場合は違いがあります。operator()を使用std::forwardすると、引数の値カテゴリが伝播されます。使用しない場合、値カテゴリは失われ、関数は常に左辺値として呼び出されます。ライブの例

#include <iostream>

struct Fun {
    void operator()() & {
        std::cout << "L-Value\n";
    }
    void operator()() && {
        std::cout << "R-Value\n";
    }
};

template <class Function>
void apply(Function&& function) {
    function();
}

template <class Function>
void apply_forward(Function&& function) {
    std::forward<Function>(function)();
}

int main () {
    apply(Fun{});         // Prints "L-Value\n"
    apply_forward(Fun{}); // Prints "R-Value\n"
}
于 2014-04-25T16:42:08.040 に答える