問題タブ [lvalue]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
7 に答える
11363 参照

c++ - 一時的なアドレスの取得が違法なのはなぜですか?

私は以下に書かれたコードが違法であることを知っています

その理由は、一時オブジェクトのアドレスを取得することが許可されていないためです。しかし、私の質問はなぜですか?

次のコードを考えてみましょう

ここで受け入れられた答えは言及しています

「通常、コンパイラは、メモリのまったく同じ場所にある 2 つのオブジェクトとして構築された一時オブジェクトとコピーを考慮し、コピーを回避します。」

ステートメントによると、一時的なものはいくつかのメモリ位置に存在していたと結論付けることができ(したがって、そのアドレスが取得された可能性があります)、コンパイラは、一時的なものと同じ場所にインプレースオブジェクトを作成することにより、一時的なものを削除することにしました。 .

これは、テンポラリーのアドレスを取得できないという事実と矛盾しますか?

また、戻り値の最適化がどのように実装されているかも知りたいです。誰かが RVO の実装に関連するリンクまたは記事を提供できますか?

0 投票する
1 に答える
310 参照

c - gccは左辺値とは何かについて混乱していますか?

gccは、次の割り当てエラーで無効な左辺値を返します。

コードを次のように変更すると、コードがなくなります。

しかし、私が知る限り、どちらもCでは100%同等です。gccは、左辺値以外の式で前者を使用しても問題はありません。これはgccの単なるバグですか?私はそれをいくつかのバージョンでテストし、同じ結果を得ました。

0 投票する
2 に答える
2622 参照

c++ - C++0x: 右辺値参照と非 const 左辺値

C++03 でプログラミングする場合、名前のない一時変数T()を function に渡すことはできませんvoid foo(T&);。通常の解決策は、一時的に名前を付けてから、次のように渡すことです。

さて、C++0x が登場しました。右辺値参照を使用すると、次のように定義された関数void foo(T&&)を使用して、一時的なものを渡すことができます。右辺値参照を取る関数は、右辺値参照 (名前のない一時参照) と左辺値参照 (名前付きの非 const 参照) の両方を取ることができるため、関数パラメーターで左辺値参照を使用する理由はありますか? 関数のパラメーターとして常に右辺値を使用するべきではありませんか?

確かに、左辺値参照を受け取る関数は、呼び出し元が一時値を渡すのを防ぎますが、それが有用な制限であるかどうかはわかりません。

0 投票する
5 に答える
3168 参照

c - 逆参照されたポインターは有効な左辺値ですか?

定義を仮定すると:

*pa がここで有効な左辺値である理由:

*p が &i に格納されている int の値に評価されるべきではありません。10、したがって「左辺値ではない」エラーを生成しますか?

0 投票する
3 に答える
2183 参照

c++ - プレインクリメント演算子がCで右辺値を与えるのはなぜですか?

C ++では、コピーではなくインクリメントされたオブジェクト自体が返されるため、pre-increment演算子は左辺値を返します。しかし、Cでは、それは右辺値を与えます。なんで?

0 投票する
5 に答える
13734 参照

c++ - 式は変更可能な左辺値ポインタから文字パラメータへのポインタでなければなりません

これがコード全体です。コンパイルすると、次のエラーが表示されます。

エラー LNK2019: 未解決の外部シンボル "void __cdecl CandyBarFunc(struct CandyBar &,char const *,double,int)" (?CandyBarFunc@@YAXAAUCandyBar@@PBDNH@Z) 関数 _wmain で参照

致命的なエラー LNK1120: 1 つの未解決の外部

0 投票する
2 に答える
1167 参照

c++ - 左辺値から右辺値への変換について、いつ必要ですか?

私はインターネットでかなり多くのことを読んでいますが、多くの人が次のルールについて言及しているようです(しかし、私はそれを標準で見つけることができませんでした)、

加算演算子+(および他のすべての二項演算子)では、両方のオペランドが右辺値である必要があり、結果は右辺値になります。等々..

C ++標準を確認したところ、(3.10 / 2節)と明確に述べられています。

prvalueが期待されるコンテキストでglvalueが表示されると、glvalueはprvalueに変換されます。

(5/9節)、

glvalue式が、そのオペランドのprvalueを期待する演算子のオペランドとして表示される場合は常に、左辺値から右辺値(4.1)、配列からポインター(4.2)、または関数からポインター(4.3)の標準変換が行われます。式をprvalueに変換するために適用されます。

これは、オペランドがprvalueを「期待する」という用語を使用します。ただし、加算演算子、乗算演算子などを調べると、結果はprvalueであるとしか言及されていませんが、オペランドが「期待される」ものについては何も述べられていません。

二項演算子が実際にオペランドがprvalueであることを期待しているかどうかは、次の場合に違いがあります。

bがprvalueであると予想される場合、ここで左辺値から右辺値への変換が行われ、次にprvalue + prvalueが実行され、prvalueが返され、結果のprvalueが左辺値aに割り当てられます。

ただし、bがprvalueである必要がない場合は、lvalue + prvalueになり、結果はprvalueになります。

標準が明示的または暗黙的にさまざまな演算子のルールについて言及している場所を本当に知りたいですか?私はすべての演算子のセクションをチェックし、オペランドと結果が左辺値か右辺値かを標準で明示的に言及している演算子はごくわずかです。ほとんどの演算子の場合、標準では結果のみが記載されており、オペランド要件は記載されていません。

ありがとう。


ところで、定数式に関する標準5.19で、二項演算子がオペランドで左辺値から右辺値への変換を必要とすることを非常に「暗黙的に」暗示している可能性があることを発見しました。詳細については、前の質問を参照してください。

constexprとconstの混合使用?

条件式は、評価される可能性のある部分式として次のいずれかが含まれない限り、定数式です(3.2)。

..。

—左辺値から右辺値への変換(4.1)

————定数式で初期化された、先行する初期化を伴う不揮発性constオブジェクトを参照する整数型または列挙型のglvalue

読んでくれてありがとう。

0 投票する
3 に答える
4696 参照

gcc - コンパイル時の GCC エラー: 関数ポインタを使用した「代入の左オペランドとして左辺値が必要です」

プロシージャ アドレスを配列に記録する C コードがあります。

GCC は、「エラー: 代入の左オペランドとして左辺値が必要です」と表示します。どうすればこれを修正できますか? 私の目的では、 AnyFunction() を直接呼び出すことはできませんでした。

0 投票する
1 に答える
2940 参照

c++ - クラス、右辺値、および右辺値参照

左辺値はメモリの決定的な領域にバインドされた値ですが、右辺値は一時的な存在であり、必ずしもメモリの決定的な領域を参照するとは限らない式の値です。右辺値が予期される位置で左辺値が使用される場合は常に、コンパイラは左辺値から右辺値への変換を実行してから、評価を続行します。

http://www.eetimes.com/discussion/programming-pointers/4023341/Lvalues-and-Rvalues

一時的な (匿名の) クラス オブジェクトを構築するか、関数から一時的なクラス オブジェクトを返すときはいつでも、オブジェクトは一時的ですが、アドレス指定可能です。ただし、オブジェクトは依然として有効な右辺値です。これは、オブジェクトが a) アドレス指定可能な右辺値であるか、または b) コンパイラが左辺値の使用を想定しているときに、左辺値から右辺値に暗黙的に変換されていることを意味します。

例えば:

また、関数によって返される一時オブジェクト(次の場合) は、次のコード セグメントのように左辺値であることもわかっています。a

次の出力が得られます。

int conversion ctor

lvalue copy ctor

ret_a実引数を使用した関数の呼び出しが、値 5 で関数の仮引数を構築A(5)する変換コンストラクターを呼び出すことを示します。A::A(int)a

関数の実行が完了すると、 を引数として使用して一時Aオブジェクトを作成し、 を呼び出します。ただし、オーバーロードされたコンストラクターのリストから削除した場合、返された一時オブジェクトは引き続き右辺値参照コンストラクターと一致します。aA::A(A&)A::A(A&)A::A(A&&)

これは私がよく理解していないことです:オブジェクトaが右辺値参照と左辺値参照の両方にどのように一致するのでしょうか? A::A(A&)の方がより適切に一致することは明らかですA::A(A&&)(したがってa、左辺値である必要があります)。ただし、仮引数aが左辺値である場合、右辺値参照は左辺値に初期化できないため、 への呼び出しと一致することはできませんA::A(A&&)。コンパイラが左辺値から右辺値への変換を行っている場合、それは簡単です。'A' から 'A&' への変換も些細なことであり、両方の関数が同一の暗黙的な変換シーケンス ランクを持つ必要があるため、オーバーロードされた関数にA::A(A&)との両方がある場合、コンパイラは最適な関数を推測できないはずです。A::A(A&&)候補セット。

さらに、質問(以前に尋ねたもの)は次のとおりです。

特定のオブジェクトが右辺値参照と左辺値参照の両方に一致するにはどうすればよいですか?

0 投票する
1 に答える
175 参照

c++ - さまざまなタイプの *-値

重複の可能性:
rvalues、lvalues、xvalues、glvalues、および prvalues とは何ですか?

右辺値、左辺値、非右辺値、非左辺値の違いは何ですか?

そのような*値の種類はいくつありますか? つまり、xvalues もあると聞きました。

これをひどく理解する必要があります。そして、これらは一時変数とラムダにどのように関連していますか?

繰り返し、困惑、矛盾した表現、冗長に聞こえたら申し訳ありません。