i
以下のタイプmain()
がint&
. そのため、初期化する必要があります。
int& f(){ static int i = 1; return i; }
int main()
{
decltype(f()) i = f();
}
しかし、標準の段落を使用すると、参照が削除されるため、式に型が5p5
あると結論付けます。f()
int
から、参照が関数の戻り値から削除された場合、式が左辺値である7.1.6.2p4
とどのように言えますか?f()
f()
式の型を評価するときに参照は削除されますが (§ 5/5 に従って)、関数呼び出し式がlvalueであるという事実は変わりません。C++11 標準のパラグラフ 5.2.2/10 によると:
関数呼び出しは、結果の型が左辺値参照型または関数型への右辺値参照の場合は左辺値、結果の型がオブジェクト型への右辺値参照の場合はxvalue 、それ以外の場合はprvalueです。
つまり、参照は関数自体の戻り値の型からは削除されず、評価された関数呼び出し式の型からのみ削除されます (つまり、 ですint
)。
関数が左辺値参照を返すという事実は、型システムが対応する関数呼び出し式を左辺値として分類できるようにするものです。これにより、式の型に左辺値参照をdecltype
追加できるようになり、 .int&