私は最近、C ++ 0xのglvalues、xvalues、prvaluesの概念、および右辺値の参照に頭を悩ませました。しかし、まだ私にはわからないことが1つあります。
「関数型への右辺値参照」とは何ですか?ドラフトでは文字通り何度も言及されています。なぜそのような概念が導入されたのですか?それの用途は何ですか?
私は最近、C ++ 0xのglvalues、xvalues、prvaluesの概念、および右辺値の参照に頭を悩ませました。しかし、まだ私にはわからないことが1つあります。
「関数型への右辺値参照」とは何ですか?ドラフトでは文字通り何度も言及されています。なぜそのような概念が導入されたのですか?それの用途は何ですか?
循環するのは嫌いですが、関数型への右辺値参照は関数型への右辺値参照です。関数型のようなものがあります、例えば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番目の宣言は、右辺値引数で構成できないことを保証する目的で、関数型への右辺値参照を形成します。T
constであってもありません。
関数への右辺値参照を形成することが合法でない場合T
、コンストラクターに右辺値を渡さなくても、この保護によりコンパイル時エラーが発生します。
古い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);
}