問題タブ [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++ - 配列と右辺値
$4.2/1 - 「「N T の配列」型または「T の境界が不明な配列」の左辺値または右辺値は、「T へのポインター」型の右辺値に変換できます。結果は、配列の最初の要素へのポインタです。」
初期化/宣言時以外に配列型の右辺値を取得する方法がわかりません。
c++ - 右辺値参照はぶら下がり参照を許可しますか?
以下を考慮してください。
これは何も計算しませんが、エラーなしでコンパイルされ、私が混乱していると思うことを示しています。danger
ぶら下がっている参照ですよね?
c++ - テンプレートの非型パラメータ+ 左辺値/右辺値
C++03 $14.1/6 - 「非型非参照テンプレート パラメータは左辺値ではありません。」
C++0x $14.2/6- 「非型非参照テンプレート パラメータは右辺値です。」
それを言い換える背後に特定の理論的根拠はありますか?
c++ - 暗黙的な変換に const を使用するのはなぜですか?
ISO/IEC 14882、プログラミング言語 – C++をよく読んだ後const
、次のような単一の引数コンストラクターを持つユーザー定義型への暗黙的な変換が必要な理由はまだわかりません
セクション 4 ライン 3 から開始
宣言 T t=e; の場合にのみ、式 e を暗黙的に型 T に変換できます。いくつかの発明された一時変数 t (8.5) に対して、整形式です。特定の言語構造では、式をブール値に変換する必要があります。そのような文脈で現れる式 e は、文脈上 bool に変換されると言われ、宣言が bool t(e); である場合にのみ整形式です。いくつかの発明された一時変数 t (8.5) に対して、整形式です。どちらの暗黙的な変換の効果も、宣言と初期化を実行し、変換の結果として一時変数を使用することと同じです。T が左辺値参照型 (8.3.2) の場合、結果は左辺値であり、それ以外の場合は右辺値です。式 e は、初期化で左辺値として使用される場合に限り、左辺値として使用されます。
その後、8.5 行 6 でユーザー定義型に関連する初期化子に関するセクションを見つけました。
プログラムが const 修飾された型 T のオブジェクトの既定の初期化を呼び出す場合、T は、ユーザー提供の既定のコンストラクターを持つクラス型でなければなりません。
最後に、ユーザー定義の変換について 12.3 行 2 で終了しました。
ユーザー定義の変換は、明確な場合にのみ適用されます (10.2、12.3.2)。
言うまでもなく、10.2 と 12.3.2 は私の質問に答えませんでした。
const
暗黙の変換にどのような影響があるかについて、誰かが光を当てることができますか?- を使用すると
const
、12.3 行 2 ごとに変換が「明確」になりますか? const
セクション 4 で説明した左辺値と右辺値に何らかの影響がありますか?
c++ - C++ const 参照と const の違いは?
違いは何ですか:
および (アンパサンドなし):
どちらも同じ L と R の値を持っているようですが、違いは何ですか?
c++ - 配列型の右辺値の例を思いついたのではないかと思います
C ++03§4.2N°1:
「NTの配列」または「Tの未知の境界の配列」タイプの左辺値または右辺値は、「Tへのポインター」タイプの右辺値に変換できます。結果は、配列の最初の要素へのポインターです。
このステートメントで長い間混乱していたのは、配列型の右辺値が何を意味するのかよく理解していなかったということです。つまり、型が配列で結果が右辺値である式を思い付くことができませんでした。私はこのスレッドを読みました。これは基本的に同じ質問をし、受け入れられた答えは「いいえ、配列型の右辺値はありません」です。これには矛盾があるのではないかと思います。
C ++03§5.2.5N°4:(式E1.E2に関するもの)
E2が非静的データメンバーであり、E1のタイプが「cq1vq1 X」であり、E2のタイプが「cq2」である場合vq2 T」、式は、最初の式で指定されたオブジェクトの指定されたメンバーを指定します。E1が左辺値の場合、E1.E2は左辺値です。
それ以外の場合は右辺値であると思います(E2が参照ではない場合、その場合はでカバーされ§5.2.5 N°3
ます)。したがって...
ここに2つのオプションがあります。オプション1
:正解です、万歳、イェーイ、かっこいいです。この場合、問題は次のとおりです。他の例はありますか?
オプション2:私は間違っています。この場合の質問は次のとおりです。これは標準の欠陥ですか?
1についてはわかりませんが、2については本当に疑問です。なぜなら、関数からポインターへの変換について話すとき、関数型の左辺値だけに言及しているからです(明らかに、そのような右辺値がないことを認めています)。したがって、彼らは配列型の右辺値を考えていた可能性が非常に高いです。
ですから、基本的に私の質問は、配列型の右辺値の例を思いついたかどうかです。そうでない場合は、有効なものを提供してください。
c++11 - タプルメンバーを持つオブジェクトの移動コンストラクターのパフォーマンス
move コンストラクター、疑似 C++ クラスのパフォーマンスについて質問があります。
Foo1クラスのオブジェクトを移動すると、タプルに格納されているすべてのオブジェクトの移動コンストラクターが初期化されますよね? つまり、移動操作は非常にコストがかかる可能性があります。
でも、 Foo2クラスのオブジェクトを移動するのは、スマート ポインタに格納されたデータの内部ポインタのみを渡すだけなので、全体の移動操作ははるかに高速ですよね?
必要なコピー操作がはるかに少ないため、右値参照は左値参照よりも高速です。ただし、move コンストラクターを使用して関数からオブジェクトを返すと、同じオブジェクトをスマート ポインターに格納してスマート ポインターを返すよりもコストがかかります。
左辺値によるオブジェクトの移動は非常に遅く、スマート ポインターによる移動は非常に高速で、右辺値による移動はその中間です。
多くの人が言うほど効果的ではないため、r値の「力」はわかりません。r値の代わりにスマートポインターを使用する方が私見の方が優れており(つまり、高速です)、コードはエレガントで明確です。私は正しいですか?
c++ - 左辺値から右辺値への変換について
「単項 & 演算子のオペランドでは、左辺値から右辺値への変換は行われません。」
それが何を意味するのか知っていますか>誰か説明できますか..それをお願いします
元:
c++ - 一時的なアドレスの取得が違法なのはなぜですか?
私は以下に書かれたコードが違法であることを知っています
その理由は、一時オブジェクトのアドレスを取得することが許可されていないためです。しかし、私の質問はなぜですか?
次のコードを考えてみましょう
ここで受け入れられた答えは言及しています
「通常、コンパイラは、メモリのまったく同じ場所にある 2 つのオブジェクトとして構築された一時オブジェクトとコピーを考慮し、コピーを回避します。」
ステートメントによると、一時的なものはいくつかのメモリ位置に存在していたと結論付けることができ(したがって、そのアドレスが取得された可能性があります)、コンパイラは、一時的なものと同じ場所にインプレースオブジェクトを作成することにより、一時的なものを削除することにしました。 .
これは、テンポラリーのアドレスを取得できないという事実と矛盾しますか?
また、戻り値の最適化がどのように実装されているかも知りたいです。誰かが RVO の実装に関連するリンクまたは記事を提供できますか?
c++ - コンストラクターに最適な形式ですか?値または参照を渡しますか?
コンストラクターに最適な形式を考えています。サンプルコードは次のとおりです。
私が理解していることから、これはコンパイラーがそれぞれの状況で実行できる最善の方法です。
(1a)yはx1.m_yにコピーされます(1コピー)
(1b)yはXのコンストラクターの引数にコピーされ、次にx1.m_yにコピーされます(2コピー)
(1c)yはx1.m_yに移動されます(1移動)
(2a)f()の結果がx2.m_yにコピーされます(1コピー)
(2b)f()はコンストラクターの引数に組み込まれ、x2.m_yにコピーされます(1コピー)
(2c)f()がスタック上に作成され、x2.m_yに移動されます(1移動)
ここでいくつかの質問:
どちらの場合も、const参照による受け渡しは悪くはなく、値による受け渡しよりも優れている場合があります。これは、 「スピードが欲しいですか?値渡し」に関する議論に反しているようです。。C ++(C ++ 0xではない)の場合、これらのコンストラクターのconst参照による受け渡しを使用する必要がありますか、それとも値による受け渡しを行う必要がありますか?また、C ++ 0xの場合、値渡しよりも右辺値参照を渡す必要がありますか?
(2)の場合、一時的なものがx.m_yに直接構築されているとよいでしょう。右辺値バージョンでさえ、オブジェクトが動的メモリを割り当てない限り、コピーと同じくらいの作業である移動が必要だと思います。コンパイラがこれらのコピーや移動を回避できるようにこれをコーディングする方法はありますか?
私は、コンパイラーが最善を尽くすことができると思うことと、私の質問自体の両方で多くの仮定をしました。正しくない場合は、これらのいずれかを修正してください。