問題タブ [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.
c++ - 右辺値構造のメンバーは右辺値または左辺値ですか?
構造体を返す関数呼び出しは右辺値式ですが、そのメンバーはどうでしょうか?
このコードは私の g++ コンパイラでうまく動作しますが、gcc は「代入の左オペランドとして左辺値が必要です」というエラーを出します:
gcc はfun().v
右辺値として扱いますが、それは理解できます。
しかし、g++ は代入式が間違っているとは考えていません。それは fun1().v が C++ の左辺値であることを意味しますか?
問題は、C++98/03 標準を検索したところ、fun().v
左辺値か右辺値かについては何もわかりませんでした。
それで、それは何ですか?
c++ - POD、非 POD、右辺値および左辺値
右辺値、左辺値、POD、および非 POD に関して詳細を説明できる人はいますか? 私の理解では、int() と A() の両方が右辺値である必要があります。
c++ - C++ での参照の初期化
これら2つのステートメントに違いがある理由を誰か説明できますか?
A&
タイプの一時からのタイプの非定数参照の無効な初期化を示していますA
なぜconst
ここで重要なのですか?
c++ - この関数を左辺値のように動作させるにはどうすればよいですか?
関数を左辺値として使用できないのはなぜColPeekHeight()
ですか?
コンパイラは で文句を言いv.ColPeekHeight()-=peek
ます。左辺値を作成するにはどうすればよいColPeekHeight()
ですか?
function - LValueとしてポインタを返す関数を使用する
ポインタを左辺値として返す関数を使用できないのはなぜですか?
たとえば、これは機能します
しかし、これではありません
ポインター変数を左辺値として使用できますが、ポインターを左辺値として返す関数を使用できないのはなぜですか?
また、関数がポインターではなく参照を返す場合、それは有効な左辺値になります。
c++ - C++0x右辺値参照-左辺値-右辺値バインディング
これは、 C++0x右辺値参照と一時的なものに対する後続の質問 です。
前の質問で、このコードがどのように機能するかを尋ねました。
暗黙の一時的なもののために移動オーバーロードを呼び出す必要があるようです。これはGCCでは発生しますが、MSVC(またはMSVCのIntellisenseで使用されるEDGフロントエンド)では発生しません。
このコードはどうですか?
以前の質問への回答に基づくと、機能g1
は合法であるようです(GCC 4.3-4.5では受け入れられますが、MSVCでは受け入れられません)。g2
ただし、 13.3.3.1.4 / 3節では、左辺値が右辺値のref引数にバインドできないため、GCCとMSVCはどちらも拒否します。私はこの背後にある理論的根拠を理解しています-それはN2831「右辺値参照による安全性の問題の修正」で説明されています。また、GCCの元のパッチは著者の1人(Doug Gregor)によって書かれたため、GCCはおそらくその論文の著者が意図したとおりにこの条項を実装していると思います。
しかし、これは非常に直感的ではありません。私にとって、(a)aconst string &
は概念的にastring &&
よりもaconst char *
に近く、(b)コンパイラは、次のg2
ように記述されているかのように、に一時的な文字列を作成できます。
実際、コピーコンストラクターは暗黙の変換演算子と見なされる場合があります。構文的には、これはコピーコンストラクターの形式で提案され、標準では13.3.3.1.2/4節で具体的に言及されています。ここでは、派生ベース変換のコピーコンストラクターに他のユーザー定義よりも高い変換ランクが与えられます。変換:
クラスタイプの式の同じクラスタイプへの変換には完全一致ランクが与えられ、クラスタイプの式のそのタイプの基本クラスへの変換には、コピー/移動にもかかわらず、変換ランクが与えられます。これらの場合、コンストラクター(つまり、ユーザー定義の変換関数)が呼び出されます。
void h(Base)
(これは、派生クラスを、基本クラスを値で受け取るのような関数に渡すときに使用されると思います。)
動機
これを尋ねる私の動機は、新しいc ++ 0x右辺値参照演算子のオーバーロードを追加するときに冗長コードを減らす方法(「新しいc ++ 0x右辺値参照演算子のオーバーロードを追加するときに冗長コードを減らす方法」)で尋ねられた質問のようなものです。
移動可能な可能性のある多数の引数を受け入れる関数があり、可能な場合はそれらを移動し(たとえば、ファクトリ関数/コンストラクターObject create_object(string, vector<string>, string)
など)、必要に応じて各引数を移動またはコピーする場合は、すぐに記述を開始します。たくさんのコード。
引数の型が移動可能である場合は、上記のように、値で引数を受け入れる1つのバージョンを記述できます。ただし、引数がC ++ 03の(レガシー)移動不可であるが交換可能なクラスであり、それらを変更できない場合は、右辺値参照のオーバーロードを作成する方が効率的です。
したがって、左辺値が暗黙的なコピーを介して右辺値にバインドされた場合、次のようなオーバーロードを1つだけ記述することができcreate_object(legacy_string &&, legacy_vector<legacy_string> &&, legacy_string &&)
、右辺値と左辺値の参照オーバーロードのすべての組み合わせを提供するように機能します-左辺値であった実際の引数はコピーされてからバインドされます引数には、右辺値である実際の引数が直接バインドされます。
明確化/編集:これは、C ++ 0x std::stringやstd::vectorのような可動型の値による引数の受け入れと実質的に同じであることに気付きました(moveコンストラクターが概念的に呼び出される回数を保存します)。ただし、コピー可能であるが移動不可能なタイプの場合は同じではありません。これには、明示的に定義されたコピーコンストラクターを持つすべてのC++03クラスが含まれます。この例を考えてみましょう。
g
を呼び出すf
と、x
とがコピーされy
ます-コンパイラがそれらを移動する方法がわかりません。f
代わりに引数を取ると宣言された場合、呼び出し元が引数に対してlegacy_string &&
明示的に呼び出したコピーを回避できstd::move
ます。これらがどのように同等であるかわかりません。
質問
私の質問は次のとおりです。
- これは標準の有効な解釈ですか?とにかく、それは従来のものでも意図されたものでもないようです。
- 直感的に理解できますか?
- 私が見ていないというこの考えに問題はありますか?それが正確に予期されていないときにコピーが静かに作成される可能性があるようですが、それはとにかくC ++ 03の場所の現状です。また、それはいくつかを作りますオーバーロードは現在実行可能ではないときに実行可能ですが、実際には問題になるとは思いません。
- これは、GCCの実験的なパッチなどを作成する価値があるほど重要な改善ですか?
r - Rの変数の値のnames()属性に割り当てる方法
Rでは、「assign('x'、v)」は、名前が「x」のオブジェクトをvに設定します。「x」を変数xにテキスト関数を適用した結果に置き換えます。次に、「割り当て」はその価値を示します。
残念ながら、「assign(paste('names('、'x'、')'、sep ='')、v)」は失敗します。したがって、「x」が変数xの場合、その値を設定することはできますが、その要素に名前を付けることはできません。
これを回避できますか?多分解析評価のトリック?ありがとう。
c++ - C++03の値
特定のパラメーターがC++03の右辺値であるかどうかをどのように判断できますか?私はいくつかの非常に一般的なコードを書いていますが、可能であれば参照を取得するか、そうでない場合は新しいオブジェクトを作成する必要があります。オーバーロードして値による値と参照による値を取得し、右辺値の戻り値に値による関数を呼び出させることはできますか?
または、これが右辺値参照がC ++ 0xにある理由であるという非常に不快な気持ちがありますか?
編集:
is_rvalue =!(is_reference || is_pointer)?
objective-c - Objective C - 代入の左オペランドとして必要な左辺値
このコードでエラー (割り当ての左オペランドとして左辺値が必要) が発生します。
どうすれば修正できますか?
c++ - 一時値を LValue として渡す
非標準だと思う次のイディオムを使用したいと思います。戻り値の最適化を利用してベクトルを返す関数があります。
次に、私は使用したいと思います
some_func
LValue を返しません。上記のコードは理にかなっており、このイディオムは非常に便利であることがわかりました。ただし、規格外です。VC8 は最高の警告レベルでのみ警告を発しますが、他のコンパイラはそれを拒否するのではないかと思います。
私の質問は:私がやりたいのとまったく同じことを達成する方法はありますか(つまり、ベクトルを構築し、別のベクトルに代入し、古いものを破棄します)、準拠しています(代入演算子を使用しません。以下を参照) ?
私が書いたクラスでは、通常、代入を次のように実装します。
コピー省略を利用して、私の問題を解決します。ただし、標準タイプの場合swap
は、一時的な無駄なコピーが必要ないため、本当に使用したいと思います。
また、VC8 を使用して標準 C++ を生成する必要があるため、C++0x とその右辺値参照について聞きたくありません。
編集:最後に、私は思いついた
左辺値を使用する場合、y が一時的な場合、コンパイラはコピー コンストラクターへの呼び出しを自由に最適化し、左辺値がある場合に使用するためstd::swap
です。私が使用するすべてのクラスは、 の愚かでないバージョンを実装するために「必要」ですstd::swap
。