問題タブ [reference-binding]
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++ - const参照がない場合、一時オブジェクトは削除されますか?
この 2 つの関数を見てみましょう。
process_c_string
によって返される引数を使用したの 2 つの可能な呼び出しを次に示しますget_string
。
の返されたオブジェクトへの const 参照をバインドしない場合
/li>get_string
。の返されたオブジェクトへのバインディング const 参照を使用します
/li>get_string
。
2番目の方法が有効であることは知っていますが、最初の方法についてはどうですか?この場合について標準は何と言っていますか? によって返された一時オブジェクトは、存在しないため、終了get_string
する前に削除されますか?process_c_str
const reference
注: MSVC ではどちらのバージョンも問題ありません。
c++ - このC++静的分析ルールはそのまま意味がありますか?
私はいくつかのC++静的分析ルールを実装していますが、そのうちの1つは、関数が関数の参照パラメーターへの参照またはポインターを返すことを禁止しています。つまり、以下はすべて非準拠です。
これを正当化する理由は、「参照パラメーターが一時オブジェクトであるか、パラメーターへの参照であるかは、実装で定義された動作です」ということです。
ただし、C ++のストリーム演算子はこのように記述されているため、私はこれに戸惑っています。
C ++のストリーム演算子は、一般に実装定義の動作を示さないと私はかなり確信していると思います。では、何が起こっているのでしょうか。
現在の私の理解によれば、一時的なものは非定数参照にバインドできないことに基づいて、#1と#3が明確に定義されていると思います。したがってint& x
、スコープを超える存続期間を持つ実際のオブジェクトを指します。したがって、そのオブジェクトへのポインタまたは参照を返すことは問題ありません。一時的なものがバインドされている可能性があるため、#2は危険であると予想しconst int& x
ます。その場合、そのアドレスを取得しようとするのは悪い計画のように思われます。#4についてはよくわかりません-私の腸の感覚は、それも潜在的に危険であるということですが、私にはわかりません。特に、次の場合に何が起こるかはわかりません。
c++ - タイプ 'const char *' の右辺値からのタイプ 'const char*&' の非 const 参照の無効な初期化
私はmystrcpy関数を作りました、
そして主な機能:
コンパイルされず、「タイプ 'const char *'の右辺値からのタイプ 'const char * &'の非const参照の無効な初期化」と表示されます...
私がするとき:
エラーなしでコンパイルされます。
前者が機能しない理由を知る必要があります、ありがとう。
c++ - 参照メンバーを更新するために新しい配置を使用しますか?
次のコードは C++ で有効ですか?
参照は 2 回バインドされるべきではありませんよね?
c++ - 参照の初期化と直接バインディングと間接バインディング
次のケースを考えてみましょう
仕様はhttp://eel.is/c++draft/dcl.init.ref#5で、参照バインディングが直接か間接かについて述べています
最後の場合 (つまり、初期化式から一時的なものを作成して初期化する場合) を除くすべての場合において、参照は初期化式に直接バインドされていると言われます。
上記のケースは最後のものには一致しませんが、最後から 2 番目のブレットに一致します。
T1 または T2 がクラス型であり、T1 が T2 に関連する参照でない場合、ユーザー定義の変換が考慮されます ... 非参照のコピー初期化について説明したように、変換関数の呼び出しの結果は次のようになります。参照を直接初期化するために使用されます。
したがって、A()
参照へのバインディングは間接バインディングです。続行するには、再び参照の初期化に再帰します。今度は prvalue の typeを使用int
して、初期化を試みますint&&
。これで、直接バインディングを意味する最後の箇条書きになります。
では、参照のバインディングについて何が言えますか...直接または間接的にバインドしますか? 検討する式に応じて、両方を実行しますか (初期化式と変換関数呼び出しの結果)?
特に私たちの場合、段落は、初期化子式に直接バインドし、初期化子式の変換の結果に間接的にバインドすると言っているようです。ただし、オーバーロード解決に関する章http://eel.is/c++draft/over.ics.refでは、
- 参照型のパラメーターが直接 ([dcl.init.ref]) 引数式にバインドされている場合、
- パラメーターが、引数式に変換関数を適用した結果に直接バインドされる場合、
- 参照型のパラメーターが引数式に直接バインドされていない場合、
みたいな場合に
ケース 1 が適用されますが、適用することを意図していないことは確かです。私の直感では、「最後を除くすべての場合」は、一時的なケースの作成だけでなく、最後の 2 番目の箇条書き、または 2 つの箇条書きを含む「Otherwise:」ブランチ全体 (つまり、 「最後」は箇条書き階層の異なるレベルを指します)。明確にしていただけますか?
c++ - タイプ「std::string&」の非 const 参照の無効な初期化
rtrim()
アルゴリズムを使用せずに、C++ の文字列ヘッダーから関数を使用して文字列をトリミングしようとしています。
私がしたことは、スペースが存在する場合は開始位置と終了位置を調べることでした。使用して削除するだけですisspace()
が、コンパイルすると、次のエラーが発生します。
タイプ 'const char*' の右辺値からのタイプ 'std::string& {aka std::basic_string&}' の非 const 参照の無効な初期化</p>
ここに私のコードがあります:
などのパラメーターを設定しstring s = ( "hello world\t ");
て実行すると、動作cout << rtrim(s) << endl;
しているように見えますが、上記のコードのようには動作しません。助言がありますか?
c++ - rval ref が lval ref 関数にバインドされるのはなぜですか?
以下のコードでは、 is_rvalue_reference
true を返します。testRef(int &&)
私は呼び出されることを期待していますが、そうではありませんtestRef(int &)
(少なくとも私の Visual Studio 2015 コンパイラでは)。
理由について何か考えはありますか?
これは右辺値参照は左辺値として扱われますか?の質問とは異なることに注意してください。
その投稿では、彼らは関数内の変数について話している: それは、私の例で変数 i が右辺値か左辺値かを尋ねるようなものです (答えは、どちらの場合も左辺値であるということです。両方の場合にアドレスがあるからです) )。
右辺値へのキャストである右辺値と を持つことの全体的なポイントはstd::move
、関数とコンストラクターで適切なオーバーロードを選択できるようにすることです。たとえば、次のケースはいずれも への呼び出しに解決されますtestRef(int && i)
。
しかし、右辺値参照ではそうではないようです。