2011-08-10 14 views
15

私は最近、rvalueの参照と同様に、glvalues、xvalues、およびprvaluesのC++ 0xの概念の周りに私の心を包み込んでいます。しかし、まだ私を逃しているものが1つあります:関数型の右辺値は何ですか?

とは何ですか?機能タイプの値はです。ドラフトで何度も言及されています。なぜそのようなコンセプトが導入されたのですか?それの用途は何ですか?古いCでは

+0

あなたは最終的に答えを理解しましたか?私は答えの下にコメントを残しました。あなたが明確化を認識しているなら、それを提供してください。ありがとう –

答えて

15

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という値をコンストラクタに渡さなくてもコンパイル時エラーが発生します。

+3

あなたは 'void()'を意味すると思います。 'void()()'はGCC/binutilsの誤ったデングリングでしたが、(しばらく前に修正されました)(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46332)。 –

+1

@Johannes:ありがとう!それは*ほとんどの*有用でした! –

+0

これは不気味で、私は問題を理解しています。コンパイル時のエラーに関する最後の文については、SFINAEはこの場合2番目の宣言を無視するだけではありませんか? – Kos

0

++標準以下は禁止されています

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); 
} 
+5

多分私は疑問を誤解しましたが、私はOPは関数型(すなわちラムダなど)への参照値の参照を話していると思います。 – user786653

関連する問題