2013-05-27 10 views
6

私はのiのタイプがint&であることを知っています。そのため、初期化する必要があります。main()の下の「i」のタイプ。なぜそれはint&ですか?

int& f(){ static int i = 1; return i; } 

int main() 
{ 
    decltype(f()) i = f(); 
} 

しかし、標準で段落5p5を使用して、私は参照が削除されたとして表現f()int入力したと結論付けています。

7.1.6.2p4から、f()という式は、関数のreturnから参照が削除されているため、左辺値であるとはどういうことが言えますか?

+0

これは、C++ 14の 'decltype(auto)'機能がどのように機能するかに注意してください。 – PlasmaHH

答えて

6

基準は(§5/5の通り)の発現のタイプを評価する際にドロップされ、これは関数呼び出し発現f()左辺であるという事実を変えません。

結果型は タイプを機能する左辺参照型または右辺値参照である場合、関数呼び出しが左辺ある:パラグラフC++ 11規格の5.2.2/10あたりxvalue結果のタイプがの値の場合は、オブジェクトタイプの場合は、そうでない場合はです。すなわち

、参照のみ(従って、である、int)を評価関数呼び出し式の型から、関数自体の戻り型から削除されません。

機能が左辺値参照が左辺値ように、対応する関数呼び出し式を分類するための型システムを可能にするものである戻っているという事実 - 今度は、decltypeは型に左辺値の参照を追加することを可能にします、その結果、int&が得られる。