次の 2 つを検討してください。
template <class Function>
void apply(Function&& function)
{
std::forward<Function>(function)();
}
と
template <class Function>
void apply(Function&& function)
{
function();
}
どのような場合に違いがあり、具体的にどのような違いがあるのでしょうか?
次の 2 つを検討してください。
template <class Function>
void apply(Function&& function)
{
std::forward<Function>(function)();
}
と
template <class Function>
void apply(Function&& function)
{
function();
}
どのような場合に違いがあり、具体的にどのような違いがあるのでしょうか?
に 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"
}