問題タブ [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++ - 右辺値のアドレスを取得する
これは、以前のバージョンでは機能していましたが、GCC 4.6 では機能しません。
今それは言う: xvalue (rvalue 参照) のアドレスを取得します。
右辺値のアドレスを別の関数に安全に渡す方法はありますか?
c++ - 関数をBigStruct&&foo(...);として宣言するのは良い習慣ですか。
出力は次のとおりです。
サンプルコードは、f_1()がf_2()よりも効率的であることを明らかに示しています。
だから、私の質問は:
関数を常にsome_return_type&&f(...);として宣言する必要があります。some_return_typeの代わりにf(...); ?
私の質問に対する答えが正しい場合、別の質問が続きます。
some_return_type f(...);として宣言された多くの関数があります。C ++の世界では、それらを最新の形式に変更する必要がありますか?
pointers - Goの一時的なアドレス?
このような場合を処理する最もクリーンな方法は次のとおりです。
これにより、次のエラーが生成されます。
a() のアドレスを取ることはできません
私の理解では、アドレスが取得された場合、Go は自動的にローカル変数をヒープに昇格させます。ここで、戻り値のアドレスが取得されることは明らかです。これを処理するための慣用的な方法は何ですか?
c++ - 配列と右辺値(パラメーターとして)
次のコードに示されている関数呼び出し(パラメーターとして配列を使用)を区別する方法があるかどうか疑問に思います。
fooの「関数ファミリ」は、一時オブジェクトと名前付きオブジェクトを区別できます。foo_arrayの場合ではありません。
C ++ 11で可能ですか?そうでなければ、可能だと思いますか?(明らかに標準を変更します)
よろしく。フェルナンド。
c++ - 右辺値参照は Mac OS X 10.7.4 および FreeBSD 9.0 では機能しません
これが私のコードです
--std=c++0x を指定して GCC 4.7.0 または clang 3.1 を使用して Linux でコードをコンパイルすると、0 と 2 が出力されました。 --std=c++0x を指定して clang 3.0 または clang 3.1 を実行すると、2 と 2 が出力されます。私の Mac OS X と FreeBSD の GCC は v4.2.1 で、--std=c++0x をサポートしていません。そこで、Boost.Move を使用しました。
-I~/boost_1_49_0 を指定して GCC 4.2.1 を使用して Mac OS X でコードをコンパイルすると、まだ 2 と 2 が出力されます。
更新: --stdlib=libc++ を追加すると、コードは 0 と 2 を出力しました。右辺値の参照は機能しているように見えました。しかし、ベクトル型を size_t から string に変更すると、コードの最後の 3 行をコメントしたにもかかわらず、コンパイル エラーが発生しました。今回の問題は Rvalue 参照とは関係なく、push_back() 関数に起因していました。--stdlib=libc++ を削除すると、コンパイルに合格する可能性があります。
どのクラン
clang++ --std=c++11 --stdlib=libc++ rval.cpp
c - C 右辺値と左辺値を識別する方法は?
C では、rvalues と lvalues を識別する方法はありますか?
それらのいくつかは簡単に識別できます。たとえば、割り当てでは、左側の値が左辺値で、右側の値が右辺値です。
しかし、他のシナリオでは、そのようなルールによる識別は困難です。
例: *p++
and i++
(p は整数へのポインターで、i は整数) - 右辺値か左辺値かを識別する方法は? コンテキストは++*p++
機能しますが、右辺値である++i++
ため機能しません(真面目な人が言ったように)。i++
式で右辺値と左辺値を識別する方法は?
c++ - *これを返します。ポインタを削除します
私が考えているのはA
、 SetVar によって返される右辺値が同一のコピーでClass
あり、同じポインターを共有していることVar
です。しかし、右辺値がそのデコンストラクターを呼び出すと、Class
のVal
.
atPOINT A
*Val
は 8 に等しいが、 atは にPOINT B
*Val
等しい-17891602
。2回削除しようとしたため、_BLOCK_TYPE_IS_VALID(pHead->nHeadUse)も取得Val
します。
デコンストラクターを削除すると問題は解決しますが、メモリ リークが発生します。
c++ - const 参照による引数の受け渡しではなく、いつコピー省略を選択する必要がありますか?
重複の可能性:
値渡しは C++11 の妥当なデフォルトですか?
私はスピードが欲しいを読んでいますか?値渡し。コピー省略と RVO についての Dave Abrahams による。そして、なぜコピー省略が必要なのだろうか?
コピーを避けるために、関数の引数を const 参照で渡す必要があると何度も言われました (私が読んだほぼすべての C++ 本で、これについて教えてもらいました)。
2 つの関数があるとします。
実引数が右辺値の場合、両方の関数でコピーが回避されます。しかし、実際の引数が左辺値の場合、コピーは f2 ではなく f1 でのみ回避されます。では、なぜこの機能が必要なのでしょうか?
c++ - 右辺値の委任、またはconstメンバー関数に相当する右辺値
明らかに、上記のコメントの関数は合法的なC ++ではありませんが、これを実現する方法があるかどうかを知る必要があります。
など、への各呼び出しはfrob()
、その「移動」バージョンを効果的に呼び出します。これはコンパイル時に判断できるものなので、なんらかの形で存在しない理由は考えられません。
私はこのようなものを書くことができます:
その結果、次のようになります。
これは読むのがやや面倒で、委任で「物事を綴る」という私の目標を達成していません。
c++ - 右辺値ではない三項演算子の結果
このプログラムをC++11コンパイラでコンパイルする場合、ベクトルは関数の外に移動されません。
このようにインスタンスを返すと移動します。
これがideoneのデモです。
gcc4.7.0とMSVC10で試してみました。どちらも同じように動作します。
これが発生する理由は次
のとおりです。三項演算子の型は、returnステートメントが実行される前に評価されるため、左辺値です。この時点で、aとbはまだxvaluesではありません(まもなく期限切れになります)。
この説明は正しいですか?
これは規格の欠陥ですか?
これは明らかに意図された動作ではなく、私の意見では非常に一般的なケースです。