問題タブ [rvalue]
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.
c++ - 右辺値構造のメンバーは右辺値または左辺値ですか?
構造体を返す関数呼び出しは右辺値式ですが、そのメンバーはどうでしょうか?
このコードは私の g++ コンパイラでうまく動作しますが、gcc は「代入の左オペランドとして左辺値が必要です」というエラーを出します:
gcc はfun().v
右辺値として扱いますが、それは理解できます。
しかし、g++ は代入式が間違っているとは考えていません。それは fun1().v が C++ の左辺値であることを意味しますか?
問題は、C++98/03 標準を検索したところ、fun().v
左辺値か右辺値かについては何もわかりませんでした。
それで、それは何ですか?
c++ - 一時オブジェクトのアドレスを取得する
§5.3.1 単項演算子、セクション 3
単項 & 演算子の結果は、そのオペランドへのポインターです。オペランドは、左辺値または修飾 ID でなければなりません。
この文脈で「あるべき」とは正確にはどういう意味ですか?一時的なアドレスを取るのはエラーだということですか?g++ は警告のみを表示するのに対し、comeau は次のプログラムのコンパイルを拒否するため、私はただ疑問に思っていました。
g++警告:taking address of temporary
コモーエラー: _expression must be an lvalue or a function designator
Microsoft コンパイラまたは他のコンパイラを持っていて、このプログラムをテストできる人はいますか?
c++ - POD、非 POD、右辺値および左辺値
右辺値、左辺値、POD、および非 POD に関して詳細を説明できる人はいますか? 私の理解では、int() と A() の両方が右辺値である必要があります。
c++ - C++ での参照の初期化
これら2つのステートメントに違いがある理由を誰か説明できますか?
A&
タイプの一時からのタイプの非定数参照の無効な初期化を示していますA
なぜconst
ここで重要なのですか?
c++ - T()= T()が許可されるのはなぜですか?
この式T()
は(標準による)右辺値を作成すると思います。ただし、次のコードはコンパイルされます(少なくともgcc4.0では)。
メンバー関数は一時的に呼び出すことができ、上記は最初のから作成された一時的な右辺値に対してoperator =を呼び出すだけなので、技術的にはこれが可能であることを私は知っていT()
ます。
しかし、概念的には、これは右辺値に新しい値を割り当てるようなものです。これが許可される正当な理由はありますか?
編集:私がこれを奇妙だと思う理由は、組み込み型では厳密に禁止されていますが、ユーザー定義型では許可されているためです。たとえば、int(2) = int(3)
これは「割り当ての無効な左辺値」であるため、コンパイルされません。
ですから、本当の問題は、このやや一貫性のない動作が理由で言語に組み込まれたのではないかということだと思います。それとも歴史的な理由でそこにありますか?(たとえば、右辺値式でconstメンバー関数のみを呼び出すことができるようにする方が概念的には適切ですが、既存のコードが破損する可能性があるため、これを行うことはできません。)
c++ - テンプレート内の C++ 右辺値一時変数
以下のメカニズムの違いを教えてください。
インスタンス化に関して私の推論は正しいですか? として最初にインスタンス化されないのはなぜconst T&
ですか?
ありがとうございました
c++ - FCDの右辺値と一時オブジェクト
右辺値と一時オブジェクトの違いを理解するのにかなりの時間がかかりました。しかし、現在、最終委員会の草案は75ページに次のように述べています。
右辺値[...]は、xvalue、一時オブジェクトまたはそのサブオブジェクト、またはオブジェクトに関連付けられていない値です。
目を信じられない。これはエラーに違いありませんよね?
明確にするために、これが私が用語を理解する方法です:
このプログラムには、同じ一時オブジェクトを表す2つの式があります。prvalueとlvalueです。式はオブジェクトではありませんが、それらの評価によってオブジェクトが生成される場合があります。具体的には、prvalueを評価すると一時オブジェクトが生成されますが、prvalueは一時オブジェクトではありません。誰かが私に同意しますか、それとも私が狂っていますか?:)std::string("hello")
str
c++ - C++03の値
特定のパラメーターがC++03の右辺値であるかどうかをどのように判断できますか?私はいくつかの非常に一般的なコードを書いていますが、可能であれば参照を取得するか、そうでない場合は新しいオブジェクトを作成する必要があります。オーバーロードして値による値と参照による値を取得し、右辺値の戻り値に値による関数を呼び出させることはできますか?
または、これが右辺値参照がC ++ 0xにある理由であるという非常に不快な気持ちがありますか?
編集:
is_rvalue =!(is_reference || is_pointer)?
c++ - Visual Studio 2010 でデストラクタを使用した C++ 右辺値式によって警告 C4701 が生成される
次の C++ コードは、Visual Studio 2010 で警告なしにコンパイルされます。
ただし、str_wrapper にユーザー定義のデストラクタがある場合、コードは callFunc(x, y) 行で警告を生成します。
- 警告 C4701: 初期化されていない可能性のあるローカル変数 'y' が使用されました。
両方の例で警告が生成された場合、またはどちらの例でも警告が生成されなかった場合は幸いです。よくわからない C++ ルールが欠けているのでしょうか、それともコンパイラのバグですか?