問題タブ [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++ - リテラル値のスコープは何ですか?コンパイラはどのようにそれにメモリを割り当てますか?
12
整数リテラルと言われるため、LValueでは使用できません。
- コンパイラはどのようにリテラルにメモリを割り当てますか?
- リテラルの範囲は何ですか?
- スコープに&12が含まれるアドレスを取得できないのはなぜですか?
c++ - RValuesは何で構成されていますか?
RValueはメモリの操作可能な領域ではないため、整数などのリテラルはRValueと見なされます。
- 定数はRValueを構成しますか?
const int x = 0;
少なくとも1回は操作可能です。 - 現在、コンパイラーによって作成された一時オブジェクトは、操作可能なメモリー領域がある場合でもRValuesです。どうしてこんなことに?
「ユーザー」が変更できないので?これが理由ですか?
それで、「ユーザー」が操作できないメモリ領域はRValueと呼ばれますか?
c++ - 返されたオブジェクトをどのように割り当て可能にすることができますか?
効果的な C++ の項目 3 で、Scott Meyers は次operator*
の名前のクラスのオーバーロードを提案していRational
ます。
戻り値がconst
修飾されている理由は、次の行で説明されています。修飾されていない場合const
、プログラマは次のようなコードを記述できます。
または、おそらく:
けっこうだ。関数の戻り値、ここでは operator* は右辺値であり、割り当て可能ではないと思ったので、今は混乱しています。私が持っていた場合:
でコンパイルに失敗しますinvalid lvalue in assignment
。なぜここでそれが起こらないのですか?誰かがこれに光を当てることができますか?
EDIT : Scott Meyers のまさに Item に関する他の多くのスレッドを見てきましたが、ここで公開した右辺値の問題に取り組むものはありませんでした。
c++ - C++ での右辺値バインディングの混乱
(ほぼ) 同じように扱われるべきだと思う 3 つの関数呼び出しがありますが、明らかにそうではありません。3 つのうちの 1 つがコンパイルされない理由を理解しようとしています (g++ -std=c++0x)。
この質問は C++0x rvalue references - lvalues-rvalue bindingの行に少し沿っていますが、そこに回答がある場合は、申し訳ありませんが、抽出できませんでした。
私が望むのは、関数 bar() を任意の種類の文字列で呼び出して、それを機能させることです。を定義するだけで十分void barR(const string &x)
ですが、その理由を本当に理解したいです。
3 番目の呼び出しが異なる理由を理解していただき、ありがとうございます。
c++ - C++03. 実行時だけでなく、コンパイル時に rvalue-vs-lvalue をテストする
C++03 では、Boost の Foreach は、この興味深い手法を使用して、式が左辺値か右辺値かを実行時に検出できます。(私はこの StackOverflow question: Rvalues in C++03を介してそれを見つけました)
これが実行時に動作するデモです
(これは、私の最近の別の質問について考えているときに発生した、より基本的な質問です。これに対する回答は、他の質問の回答に役立つ可能性があります。)
コンパイル時に C++03 で rvalue-ness をテストするという質問を詳しく説明したので、これまで試してきたことについて少しお話しします。
コンパイル時にこのチェックを実行できるようにしたい。C++11なら簡単だけど、C++03が気になる。
私は彼らのアイデアに基づいて構築しようとしていますが、さまざまなアプローチにもオープンです。彼らの手法の基本的な考え方は、このコードをマクロに入れることです。
の左側が「true」である?
ため、EXPRESSION が評価されることはないと確信できます。しかし興味深いのは?:
、パラメーターが左辺値か右辺値かによって、演算子の動作が異なることです (詳細については、上記のリンクをクリックしてください)。rvalue_probe
特に、 EXPRESSION が左辺値であるかどうかに応じて、次の 2 つの方法のいずれかでオブジェクトを変換します。
スローされたテキストをキャッチして、EXPRESSION が左辺値か右辺値かを分析するために使用できるため、これは実行時に機能します。しかし、コンパイル時にどの変換が使用されているかを特定する方法が必要です。
これは潜在的に有用です。
EXPRESSION は右辺値ですか?
私たちは尋ねることができます:
コンパイラがtrueをコンパイルしているとき rvalue_probe() : EXPRESSION、オーバーロードされた 2 つの演算子
operator X
またはoperator X&
のどちらが選択されていますか?
(通常、戻り値の型を変更してそれを取得するsizeof
ことで、どのメソッドが呼び出されたかを検出できます。しかし、これらの変換演算子では、特にそれらが?:
.
私は次のようなものを使用できるかもしれないと思った
EXPRESSION が左辺値の場合、operator&
が選択され、式全体が型になることを期待しました&
。しかし、うまくいかないようです。ref 型と非 ref 型を区別するのは非常に困難 (不可能?) です。特に、?:
どの変換が選択されたかを確認するために式の内部を掘り下げようとしている今はそうです。
ここに貼り付けたデモコードは次のとおりです。
(最後に別のコードがいくつかありましたが、それは単に混乱を招くだけです。失敗した回答の試行を実際に見たくはありません! 上記のコードは、実行時に lvalue-vsus-rvalue をテストする方法を示しています。)
c++ - behaviour of const_cast
I was reading about const_cast operator in c++
1.First weird thing thing i can't understand is
const_cast operator syntax i.e.
-const_cast--<--Type-->--(--expression--)--------------------><
what i have understand about this syntax is that it helps to cast away constness of anexpression
of type Type
.But consider this code
Here in line ConstTest *c = const_cast<ConstTest*>(this)
, I think that the const of this
pointer should be cast away, but the output shows that it is the object which this
refers to that loses its const-ness.
I feel that the code should have been ConstTest *c = const_cast<ConstTest>(*this)
, but this produces an error. I know i am wrong at many interpretations. Please correct them all.
2.my second problem is the statement given below
The result of a const_cast expression is an rvalue unless Type is a reference type. In this case, the result is an lvalue.
Why is this so, and why it is not true in case of pointers?
c++ - 参照引数を受け取る基本クラスを構築するにはどうすればよいですか?
g++ 4.1.2 を使用して次のコードをコンパイルできません。
私は得る:
std::auto_ptr<A>
型から型への右辺値式の無効なキャストstd::auto_ptr<A>&
問題は、初期化リスト内にいるため、変数を定義してその参照を渡すことができないことです。
クラスの変更しか許可されていない場合、どうすればそれを行うことができC
ますか?
c++ - C++11: 右辺値の割り当てが許可されているのはなぜですか?
関数から右辺値参照を返すことが危険である理由を理解していることから、次のコードが原因です。
これはy
、未定義のダングリング参照として残ります。
しかし、なぜ上記のコードがコンパイルされるのか理解できませんか? 右辺値参照を別の右辺値参照に割り当てる正当な理由はありますか? 右辺値は、大まかに言えば「一時的」であると想定されていませんか?つまり、式の最後で無効にされますか? それらを割り当てることができることは、私にはばかげているようです。
c++ - 右辺値へのポインター
左辺値と右辺値の両方の参照を受け入れる関数を呼び出すための解決策を探しているときに、次のコードを書きました (いいえ、二度とやりません、約束します)。
目標は、左辺値と右辺値の両方の参照を受け入れる関数を提供することでした。2 つの関数を記述したり、呼び出し側で左辺値/右辺値を気にしたりしたくありませんでした。したがって、l/rvalue (この場合は get_addr) であるかどうかに関係なく渡すことができるように、パラメーターをラップするマクロ/関数を提供することを考えました。
関数に渡されたデータを変更したい場合はありません。
そのコードは私にとっては問題なく機能していますが、安全であるとは思えません。私の推測: get() を shared_ptr から呼び出した後、 get_value() の結果は不要になり、却下される可能性があります。そのため、print_value は無効な参照を受け取る可能性があります。それは理にかなっていますか?いずれにせよ、提供されたコードが好きではありません。一時変数を使用して問題を解決しました。
それにもかかわらず、その問題に対するより良い解決策があったかどうか、私はまだ興味があります. 構文の観点から、l/rvalue の両方を受け入れる関数「void print_value(int&& p)」を 1 つだけ使用することをお勧めします。移動セマンティクス、l/rvalue 変換を見てきましたが、本当に見栄えのする解決策が見つかりませんでした。
c++ - では、最近の基本クラスはどのように C++11 で書かれているのでしょうか?
更新: MSVC10 を使用していますが、デフォルトの移動セマンティクスが得られません
いくつかのポッド以外のメンバーを持つ通常のクラスを作成したいとしましょう。
いつものように、コピー コンストラクターと、コピー コンストラクターを使用する代入演算子を実装します。
次に、移動コンストラクターと移動割り当てを実装します。これは、すべてのメンバーに対して std::move の代わりに std::swap を使用します。これは、移動セマンティクスが実装される前に記述される可能性があるためです。移動セマンティクスが実装されているため、実装を省略できます。スワップメンバー関数:
そして、ここに私の質問があります。メンバーについて何も知らないと仮定して、ここで何かをより一般的に行うことはできますか?
たとえば、move-constructor は const 宣言されたメンバーと互換性がありませんが、Foo(Foo&& other) : a_(std::move(other.a_)), b_(std::move(other.b_)){}
move-semantics のないクラスがコピーされないことを確認できないため、move コンストラクターを実装すると? move-constructor を move-assignment で巧妙な方法で利用できますか?