2016-05-30 7 views
6

C++は右辺値、つまり主に移動セマンティクスやその他のメモリ効率的なタスクを実行するために使用される右辺値参照への参照を提供するので、しかし、次のような場合にはリテラルの値が変更されますが、リテラルは読み込み専用であるため、参照はどのように読み込み専用変数の値を変更することができますか?右辺値参照はそれ自身のメモリを割り当てるか、単にリテラルの値を変更するか?C++:右辺参照メモリ

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a = 5; 
    int&& b = 3; 
    int& c = a; 
    b++; 
    c++; 
    cout << " Value for b " << b << " Value for c " << c << endl; 
} 

第2に、一時オブジェクトに参照が割り当てられている場合、参照はそのオブジェクトのデータで機能します。しかし、一時的なオブジェクトの定義によると、それらを使用する式が終了すると削除されます。一時オブジェクトのメモリが不足している場合、参照はその一時オブジェクトのエイリアス名としてどのように動作しますか?

答えて

12

数値リテラルは、いずれの参照にもバインドすることはできません。値リファレンスも左値リファレンスもバインドすることはできません。概念的には、数値リテラルはリテラル値から初期化された一時オブジェクトを作成し、この一時的な値は右値参照またはconst左値参照(int const& r = 17;)にバインドできます。リテラルの関連引用は5.1.1 [expr.prim.general]パラグラフ1であるようです:

リテラルは主な表現です。その種類はその形式(2.14)に依存します。文字列リテラルは左辺値です。他のすべてのリテラルはprvaluesです。

参照を一時的に直接バインドする場合、参照が有効範囲外になるまで有効期間が延長されます。生涯問題の関連セクションは12.2 [class.temporary]段落5です。

2番目のコンテキストは、参照が一時的なものにバインドされている場合です。

に基準部材を一時的に結合し
  • :参照は、参照が結合されたサブオブジェクトの完全なオブジェクトを除く参照の存続期間 を持続される結合または一時された一時的なコンストラクタのctor-initializer(12.6.2)は、コンストラクタが終了するまで存続します。
  • 関数呼び出し(5.2.2)の参照パラメータへの一時的なバインドは、呼び出しを含む完全式が完了するまで続きます。
  • 関数のreturn文(6.6.3)で返される値にバインドされた一時的な存続期間は延長されません。 return文の完全式の終わりに一時は破棄されます。
  • new-initializer(5.3.4)のリファレンスへの一時バインドは、new-initializerを含む完全な式が完了するまで続きます。
+0

ねえた参照から、あなたは、段落1 ' –

+1

@HarshulSharma(5.1.1) 'のようなセクション番号を教えてください:私は投稿の時に代わりにC++標準を引用しています。 ISO/IEC 14882:2014である上記記事の場合。これらの文書は、国家標準化機関から購入することができます。一部の_drafts_が利用可能です(いくつかのリンクについては、[open std](http://www.open-std.org/JTC1/SC22/WG21/)ページを参照してください)。私の参照には通常、セクション番号と "[expr.prim.general]"のような_stable参照が含まれます:セクション番号、正確な言い回し、段落番号は変わるかもしれませんが、安定した参照は残ります。引用されたテキストは引用されたテキストのように参照を使用します。 –

+0

WG21も最終草案を公表していることはわかりませんでした。私は彼らがちょうど異なるコンセプトのために異なるドラフトをリリースすると思った。今私は信頼できる基準があると思う。ありがとう:) :) –

関連する問題