問題タブ [const-reference]
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++ - C ++:const参照と初期化順序
私は次のように良いアプローチを使用しているかどうか疑問に思っています:
- 親クラス(クラスA)を作成したいのですが、このクラスは特定の「Foo」クラスのインスタンスを所有している必要があります
- 親クラスに子クラスメンバー(クラスB)を所有させたいのですが、このメンバーには親クラスのfooメンバーへの参照が必要です。
以下のコードは機能しているように見えますが、コンパイラーが十分に同情的であったことを「幸運」だったのではないかと思います。
わかりやすくするために、以下のコメントにコメントと質問を追加しました。
ありがとう !
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++ - Qtで信号を送信するときのconst-ref
これは私がconst-refでまったく得られなかったことであり、誰かが私にそれを説明してくれることを本当に望んでいます。
別の関数内で関数を呼び出すと、改ざんする予定のないスタックオブジェクトを渡すときにconst-refが最適な方法であることがわかります。例えば:
これまでのところ良いと思います。しかし、信号はどうですか?参照を渡すことに伴うリスクはありませんか?ですがconst
。const-refに関するすべてのドキュメントを読んでいるように感じますが、「オブジェクトへの参照を送信して保持するconst
」と理解しているため、まだ少し危険です。参照しているオブジェクトがスコープ外になった場合はどうなりますか?
例えば:
ここで実際に何が起こっているのですか?オブジェクトにアクセスしたいが変更したくない関数呼び出しでは、const-refを頻繁に使用します。しかし、信号はどうですか?ほとんどの信号はQtドキュメントにconst-refparmがあるようですが、どのように機能しますか?
c++ - temp を const ref メンバーに割り当てると、セグメンテーション違反が発生します
例でよりよく説明します:
tok.h
main.cpp
プログラムは間違っている 0 を出力します。実際のコードでは、セグ フォールトが発生します。
ここでは、const 参照に割り当てられた temp の寿命を延ばすという規則が成り立つと思いますが、明らかにそうではありません。その理由を知っていますか?
c++ - 参照がオブジェクトである可能性が高いのはなぜですか?
現在 C++ を学んでおり、SO の専門家以外に質問するのに適した場所は他にありません。ここよりも完全で優れた回答を見つけることができませんでした。それで、それは行きます。
dw
の値が格納されているアドレスを表示します。
しかし、なぜ:
この例では、なぜアドレスdw
ではなく値が表示されるのでしょうか?dw
c++ - ローカル オブジェクトへの const 参照を返すと、正確にはどうなりますか?
ローカル値への参照を返すのは悪いことです。しかし一方で、const 参照は一時オブジェクトの有効期間を延長する必要があります。
このコードは UB 出力を生成します。だから延命はない。
なんで?つまり、誰かが何が起こっているのかを段階的に説明できますか?
私の推論チェーンのどこに誤りがありますか?
フー():
A(32) - 担当者
return A(32) - ローカル オブジェクトへの const 参照が作成され、返されます
A a = foo(); - a は foo() 戻り値によって初期化され、戻り値はスコープ外 (式外) になり、破棄されますが、a は既に初期化されています。
(ただし、実際にはデストラクタはコピーコンストラクタの前に呼び出されます)
foo_2():
return 6 - タイプ A の temp オブジェクトが暗黙的に作成され、このオブジェクトへの const 参照が作成され (寿命を延ばします)、返されます
A a = foo(); - a は foo() 戻り値によって初期化され、戻り値はスコープ外 (式外) になり、破棄されますが、a は既に初期化されています。
(ただし、実際にはデストラクタはコピーコンストラクタの前に呼び出されます)
c++ - 一時値と戻り値の最適化への const 参照
右辺値を const 左辺値参照に割り当てると、一時的な有効期間がスコープの終わりまで延長されるという事実を認識しています。ただし、いつこれを使用し、いつ戻り値の最適化に頼るべきかは明確ではありません。
Scot Meyers の「より効果的な C++ (項目 20)」によると、2 番目の方法はコンパイラによって最適化され、オブジェクトをその場で構築できます (これは理想的でありconst&
、最初の方法で達成しようとするものとまったく同じです)。
const&
一時的に使用する場合、および RVO/NRVO に依存する場合に、一般的に受け入れられているルールまたはベスト プラクティスはありますか?const&
メソッドを使用しないよりも使用する方が悪い状況はありますか? (たとえば、C++ 11の移動セマンティクスが実装されている場合について考えLargeObject
ています...)
c++ - フィールドを公開するための定数参照
私はクラスの日付を持っています。日付を次のようにします。
何らかの理由で、コンストラクターがDay、Month、Yearと呼ばれた後は、_day、_month、および_yearを指さない/参照しないでください。
私の推測の1つは、メモリがクラスに割り当てられる前に設定されているということですが、この問題を解決するにはどうすればよいですか(メモリ割り当て後に参照を設定することもできます)。
前もって感謝します!
編集:詳細
Dayの値を取得しても、_dayの値(たとえば)は返されません。一見乱数が出ます。