C ++標準(4/5)単項&演算子のオペランドでは、左辺値から右辺値への変換は行われません。
例えば:
int x;
int *p = &x;
上記の場合、両方の左辺値p
はありますか?&x
または適切な例は何でしょうか?
編集:
これはどうですか?
int &r = x;
このステートメントには変換がないことは確かですが、&operatorがこれにどのように関与するのか混乱していますか?
C ++標準(4/5)単項&演算子のオペランドでは、左辺値から右辺値への変換は行われません。
例えば:
int x;
int *p = &x;
上記の場合、両方の左辺値p
はありますか?&x
または適切な例は何でしょうか?
編集:
これはどうですか?
int &r = x;
このステートメントには変換がないことは確かですが、&operatorがこれにどのように関与するのか混乱していますか?
&
引用符は、変換が単項のオペランド(この場合は)に適用されないことを示していx
ます。したがって、のオペランド&
は左辺値です。
これは、たとえば単項演算子とは異なり+
ます。と書く+x
と、左辺値から右辺値への変換が部分式に適用されますx
(この場合、初期化されていないため、未定義の動作になりx
ます)。
非公式には、「左辺値から右辺値への変換」は「値の読み取り」を意味します。
引用は、実際には右辺値であるの結果については何も述べていません。&
でint *p = &x;
:
x
その名前の変数を参照する左辺値であり、&x
は右辺値であり、初期化子(具体的には代入式)の一部であり、p
(サブ)式ではないため、は右辺値でも左辺値でもありません。定義されている変数の名前です。C ++宣言子の文法では、それはdeclarator-id(C ++ 03標準では8/4)です。int &r = x;
&
address-of演算子はまったく使用しません。&
宣言子の文字は、 r
intへの参照である構文上の意味であり、のアドレスを取りませんr
。C ++宣言子の文法では、実際にはptr-operatorと呼ばれます。
左辺値を保管場所と考え、右辺値をそこに保管する値と考えてください。したがって*p
、は左辺値であり、&x
は右辺値です。ただし、&はオペランド(x)として左辺値を必要としますが、結果は右辺値になりますが、これはそれ自体は変更されませんx
。
標準引用符は、基本的に、適用されるオペランドが右辺値&
にならないことを示しています。左辺値のままです。
実際、のオペランドを右辺値&
にすることはできません。左辺値である必要があります。そうでない場合、標準で許可されていない一時オブジェクトのアドレスを取得できます。
struct A{};
int *addressOfTemporary_int_object = &(int(10)); //error
A *addressOfTemporary_A_object = &A(); //error
のオペランドは左辺値&
でなければならないからです。上記の式は、部分式であり、右辺値式であるため、一時オブジェクトを作成するため、不正です。int(10)
A()
x
また、式の部分式&x
が左辺値であっても、に適用&
した結果x
は右辺値であることに注意してください。つまり、式&x
は右辺値であり、代入演算子の右側に表示することはできません。
&r = whatever; //illegal
これが見積もりの理解に役立つことを願っています。
これはどうですか?
int &r = x;
これは大丈夫です。ここ でオブジェクトの参照を作成し&
ます。ここでは、は演算子ではなく、参照に関連付けられていません。むしろ、型に関連付けられています。これを次のように書くのはそれほど混乱しません。r
x
&
r
int& r = x;
//Or if you use typedef as
typedef int& intref;
intref r = x;
「オペランド上」はx
右側のを参照する必要があります。つまりx
、ステートメントの部分式は右辺値でint *p = &x;
はなく、左辺値です。これをint a = b;
、部分式b
が右辺値(変換後)であると比較してください。
C ++標準(4/5)単項&演算子のオペランドでは、左辺値から右辺値への変換は行われません。
この引用はあなたを混乱させるためだけにあります。他の目的はありません。;)
最も重要な引用は次のとおりです(N3242を引用しているため、新しい用語には右辺値ではなく「prvalue」があります)。
glvalue式が、そのオペランドのprvalueを期待する演算子のオペランドとして表示される場合は常に、左辺値から右辺値(4.1)、配列からポインター(4.2)、または関数からポインター(4.3)の標準変換が行われます。式をprvalueに変換するために適用されます。
したがって、言語は、prvalueを期待する構成概念と、期待しない構成概念の観点から説明できます。特に、演算子&
は「prvalueを期待する」(まったく逆)ので、左辺値から右辺値への暗黙の変換は不要であり、適用されません。
標準の説明には一貫性がありません。おそらく、非常に明白であるためにx += y
、左辺値から右辺値への暗黙の変換がに適用されないことを明示的に示すことはありません。なぜ著者は、それが等しく明白でx
あるために、それが私を超えていると明示的に言う必要性を感じたのか。&x
暗黙の変換が適用されないというこれらの言及は削除する必要があると思います。この規格は、発生しない(無限に多くの)ことではなく、発生することを記述しています(発生しないことが非常に驚くべきことでない限り)。
暗黙的な変換は、式の「性質」をコンテキストの期待に合わせて調整するためにのみ適用されます(コンテキストは、式、ステートメント、宣言、ctor-init-list ...の場合があります)。
これはどうですか?
int &r = x;
このステートメントには変換がないことを確信しています。
ここでは暗黙の変換は必要ないためです。暗黙的な変換は、必要な場合にのみ適用されます。参照バインディングは右辺値を期待していません。
しかし、私は&演算子がこれにどのように関与するのか混乱していますか?
そうではない。