5

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が渡された場合、右辺値のオーバーロードされたメソッドを呼び出す必要があります。ただし、他のオーバーロードされた左辺値参照関数が呼び出されているようです。誰かがこれを明確にしてくれれば幸いです

4

1 に答える 1

3

名前付き変数は決して右辺値ではありません。これは常に左辺値です。右辺値は、名前を持たない純粋な式のみです。

int && i = int(0);

ここで、式int(0)は右辺値ですが、変数i自体は左辺値であり、右辺値にバインドされると宣言されています。

于 2014-05-12T04:33:15.693 に答える