16

私は最近、C ++ 0xのglvalues、xvalues、prvaluesの概念、および右辺値の参照に頭を悩ませました。しかし、まだ私にはわからないことが1つあります。

「関数型への右辺値参照」とは何ですか?ドラフトでは文字通り何度も言及されています。なぜそのような概念が導入されたのですか?それの用途は何ですか?

4

2 に答える 2

16

循環するのは嫌いですが、関数型への右辺値参照は関数型への右辺値参照です。関数型のようなものがあります、例えばvoid ()。そして、それへの右辺値参照を形成することができます。

N3055で導入された分類システムでは、xvalueです。

その使用はまれであり、あいまいですが、役に立たないわけではありません。たとえば、次のことを考慮してください。

void f() {}
...
auto x = std::ref(f);

xタイプがあります:

std::reference_wrapper<void ()>

そして、その概要を見ると、次のようなreference_wrapperものがあります。

reference_wrapper(T&) noexcept;
reference_wrapper(T&&) = delete; // do not bind to temporary objects

この例Tでは、関数型void ()です。reference_wrapperしたがって、2番目の宣言は、右辺値引数で構成できないことを保証する目的で、関数型への右辺値参照を形成します。Tconstであってもありません。

関数への右辺値参照を形成することが合法でない場合T、コンストラクターに右辺値を渡さなくても、この保護によりコンパイル時エラーが発生します。

于 2011-08-10T20:31:43.940 に答える
0

古いC++標準では、次のことは禁止されています。

int foo();
void bar(int& value);

int main()
{
    bar(foo());
}

foo()の戻り型は右辺値であり、bar()への参照によって渡されるためです。

これは、(私が思うに)2005年以降、VisualC++でMicrosoft拡張機能が有効になっている場合でも許可されていました。

c ++ 0x(またはmsvc)なしで考えられる回避策は次のように宣言します

void bar(const int& value); 

または、一時変数を使用して、foo()の戻り値を格納し、変数を(参照として)bar()に渡します。

int main()
{
    int temp = foo();
    bar(temp);
}
于 2011-08-10T20:03:55.300 に答える