std::forward
何が機能するかを理解しようとしているときに、次の例に出くわしました
// forward example
#include <utility> // std::forward
#include <iostream> // std::cout
// function with lvalue and rvalue reference overloads:
void overloaded (const int& x) {std::cout << "[lvalue]";}
void overloaded (int&& x) {std::cout << "[rvalue]";}
// function template taking rvalue reference to deduced type:
template <class T> void fn (T&& x) {
overloaded (x); // always an lvalue
overloaded (std::forward<T>(x)); // rvalue if argument is rvalue
}
int main () {
std::cout << "calling fn with rvalue: ";
fn (0);
std::cout << '\n';
return 0;
}
プログラムの出力は
右辺値で fn を呼び出す: [左辺値][右辺値]
さて、私の質問は、どうやってlvalue
最初に手に入れたのですか? main
これが私が呼んだ私たちの私の考え方ですfn(0);
Now 0 is rvalue. したがって、ユニバーサル参照 x は次のように推定されます。
void fn (int&& && x);
参照の崩壊によると、次のようになります
void fn (int&& x);
したがって、右辺値x
のように動作します。したがって、x
が渡された場合、右辺値のオーバーロードされたメソッドを呼び出す必要があります。ただし、他のオーバーロードされた左辺値参照関数が呼び出されているようです。誰かがこれを明確にしてくれれば幸いです