私は最近、rvalueの参照と同様に、glvalues、xvalues、およびprvaluesのC++ 0xの概念の周りに私の心を包み込んでいます。しかし、まだ私を逃しているものが1つあります:関数型の右辺値は何ですか?
とは何ですか?機能タイプの値はです。ドラフトで何度も言及されています。なぜそのようなコンセプトが導入されたのですか?それの用途は何ですか?古いCでは
私は最近、rvalueの参照と同様に、glvalues、xvalues、およびprvaluesのC++ 0xの概念の周りに私の心を包み込んでいます。しかし、まだ私を逃しているものが1つあります:関数型の右辺値は何ですか?
とは何ですか?機能タイプの値はです。ドラフトで何度も言及されています。なぜそのようなコンセプトが導入されたのですか?それの用途は何ですか?古いCでは
Iは、円形であることが嫌いが、右辺値リファレンスは、Tを機能しますypeは、関数型の右辺の参照です。関数型のようなものがあります。 void()
。そして、あなたはそれに対する右辺の参照を形成することができます。
N3055によって導入された分類システムに関して、それはx値です。
その使用方法はまれであり、あいまいですが、無駄ではありません。例えば考えてみましょう:
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()
です。したがって、2番目の宣言は、reference_wrapper
がrvalue引数で構築できないようにするために、関数型への参照値参照を作成します。 T
がconstであっても
rvalue参照を関数に作成することが合理的でない場合は、T
という値をコンストラクタに渡さなくてもコンパイル時エラーが発生します。
あなたは 'void()'を意味すると思います。 'void()()'はGCC/binutilsの誤ったデングリングでしたが、(しばらく前に修正されました)(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46332)。 –
@Johannes:ありがとう!それは*ほとんどの*有用でした! –
これは不気味で、私は問題を理解しています。コンパイル時のエラーに関する最後の文については、SFINAEはこの場合2番目の宣言を無視するだけではありませんか? – Kos
++標準以下は禁止されています
int foo();
void bar(int& value);
int main()
{
bar(foo());
}
のfooの戻り値の型は、()右辺値で、()をバーへの参照によって渡されるため。
MicrosoftとのVisual C++ではC++ 0xの(またはMSVC)なし2005
回避策(と思う)ので、有効に機能拡張が
void bar(const int& value);
または使用を宣言することになるが、これが許可されました一時変数、FOOの戻り値(記憶)及び(基準として)変数を渡す(バール):
int main()
{
int temp = foo();
bar(temp);
}
多分私は疑問を誤解しましたが、私はOPは関数型(すなわちラムダなど)への参照値の参照を話していると思います。 – user786653
あなたは最終的に答えを理解しましたか?私は答えの下にコメントを残しました。あなたが明確化を認識しているなら、それを提供してください。ありがとう –