問題タブ [pass-by-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.

0 投票する
4 に答える
529 参照

c++ - std::string はこのトリックをどのように管理しますか?

私はちょうど関数を書いた:

しかし、私はこれを

そしてそれは動作します。したがって、これが機能するためには (std::string の暗黙的なインスタンスを初期化するための const char*)、値を値渡しする必要があると考えていたでしょうが、この場合は (const) 参照によって渡されます。

参照が const の場合、const char* からインスタンス化された暗黙の一時的な std::string は偶然ですか? そうでない場合、これはどのように機能するのでしょうか?

編集

関数がオーバーロードされるとどうなりますか

どちらがコンパイラを選択しますか?

0 投票する
6 に答える
7018 参照

c++ - アンパサンド & コンストラクターで const を使用

たとえば、コンストラクターで渡されるオブジェクトに const と & を通常配置する理由を誰かが教えてくれますか。

私がここで持っている混乱は、値が参照によって渡され、関数内のその変数に発生した変更が後で反映されるため、通常 & 記号が some 関数で使用されることです。しかし一方で const は、その変数に代入を行うことはできないと言います。

誰かがそれについて良い考えを持っているなら、その理由を教えてください.

0 投票する
3 に答える
11457 参照

c++ - 空のベクターをオブジェクトに渡す「正しい」方法は何ですか?

私はかなり大規模な C++ プロジェクトに取り組んでいますが、残念ながら C++ を最大限に活用できていません。コードの大部分は、ばかげた C++ クラスでラップされた単純な C のままです。

そこで、C++ と STL をいくつか導入して、コードをより読みやすく、より安全なものにしようとしました。

ただし、ベクトルをオブジェクト メンバーに割り当てると、奇妙なクラッシュ (正確にはデバッグ エラー) が発生します。これを想像してください:

次に、コードの別の場所で、次のように呼び出します。

ただし、プログラムはデバッグ エラーで終了します: vector iterators incompatible. この割り当てで発生します。

...コピーを作成する必要があります。これが私がやろうとしていることです。

ただし、この行を次のように変更すると:

...すべてが期待どおりに機能します。

私の質問は次のとおりです。なぜですか?そして、これは空のベクトルでオブジェクトを初期化する正しい方法ですか?

実際のクラスははるかに大きく、渡されるメンバーがはるかに多いことに注意してください。これが、初期化関数を使用する理由です。また、既存の配列を渡す可能性もあるため、空または既存のデータで初期化できる必要があります。

編集: クラッシュの原因が見つかりました。私が見ているコードは、実際には少し異なる動作をすることがわかりました:

したがって、実際には A のコンストラクターが呼び出されたことがないため、ベクター メンバー (m_data) のコンストラクターも実行されませんでした。そのため、宛先ベクトルがまだ構築されていないため、コピー関数を暗黙的に呼び出すときにコンストラクターの割り当てが機能し、クラッシュしました。さて、教訓を学び、改善するためのより恐ろしいコード:)

ありがとう!

0 投票する
3 に答える
15404 参照

c++ - Qtで信号を送信するときのconst-ref

これは私がconst-refでまったく得られなかったことであり、誰かが私にそれを説明してくれることを本当に望んでいます。

別の関数内で関数を呼び出すと、改ざんする予定のないスタックオブジェクトを渡すときにconst-refが最適な方法であることがわかります。例えば:

これまでのところ良いと思います。しかし、信号はどうですか?参照を渡すことに伴うリスクはありませんか?ですがconst。const-refに関するすべてのドキュメントを読んでいるように感じますが、「オブジェクトへの参照を送信して保持するconst」と理解しているため、まだ少し危険です。参照しているオブジェクトがスコープ外になった場合はどうなりますか?

例えば:

ここで実際に何が起こっているのですか?オブジェクトにアクセスしたいが変更したくない関数呼び出しでは、const-refを頻繁に使用します。しかし、信号はどうですか?ほとんどの信号はQtドキュメントにconst-refparmがあるようですが、どのように機能しますか?

0 投票する
4 に答える
1672 参照

c++ - c++ passing by const reference

In the following program body cosists of a vector of pointers. Points is a struct of x,y,z coordinates and a point_id. I believe as body is passed by const reference, the following step should produce an error. BUt the program is running without any problem. Can you please explain me why is this.

0 投票する
2 に答える
465 参照

c++ - パラメータを値またはC++の参照で送信しますか?

重複の可能性:
値渡しよりも参照渡しの方が費用がかかる

パラメータを値またはC++の参照で送信して、どちらが優れているかを知りたいです。参照による送信よりも値による送信の方が速い場合があると聞きました。これらのケースはどれですか?

ありがとう

0 投票する
2 に答える
482 参照

c++ - C ++コンパイラに、値渡しと参照渡しのどちらを使用するかを決定させることはできますか?

この架空のヘッダーファイルを見てください。

さて、文字列への参照HungryHippo<string>が必要になるのは理にかなっていますingest-文字列のコピーは非常にコストがかかる可能性があります!しかし、HungryHippo<int>それはあまり意味がありません。int直接渡すことは非常に安価ですが(ほとんどのコンパイラーはレジスターでそれを行います)、への参照を渡すことintは余分な不必要なレベルの間接参照です。これはすべて戻り値にも当てはまります。

コンパイラに「引数を変更するつもりはないので、何が良いと思うかに応じて、値で渡すか参照で渡すかを決定する」ことを提案する方法はありますか?

関連する可能性のあるいくつかの事柄:

  • を書いtemplate <class T, bool PassByValue> class HungryHippoてからに特化することで、この効果を手動で偽造することができPassByValueます。本当に派手になりたいのなら、とに基づいて推測することもできPassByValueます。いずれにせよ、実装がほとんど同じように見える場合、これは多くの余分な作業であり、コンパイラーは、値を渡すかどうかを決定する上で、私よりもはるかに優れた仕事をすることができると思います。sizeof(T)std::is_trivially_copyable<T>
  • libc ++プロジェクトは、コンパイラーが1レベル上の選択を行えるように多くの関数をインライン化することでこれを解決しているようですが、この場合、の実装ingestはかなり複雑で、インライン化する価値がないとしましょう。コメントで説明されているように、すべてのテンプレート関数はinlineデフォルトです。
0 投票する
2 に答える
160 参照

c++ - pass-by-const-reference メソッド内の C++ pass-by-non-const-reference メソッド

pass_by_const(const std::string& s)を呼び出したいこの関数がありますpass_by_non_const(std::string& s)

このメソッドの定義があれば

コンパイラは私に譲歩しますか?回避策はありますか? pass_by_non_const私はそれが私の後ろの s を変更することを恐れています。

0 投票する
4 に答える
3407 参照

c++ - 値渡しされる c++ コピー コンストラクト パラメーター

オブジェクト a の独自のコピーに対して、freeFunct に const 以外の処理を実行させたいと考えています。

実際のコードケースでは、多くの異なるパラメーターを取り、それらすべてからいくつかのパブリック関数を呼び出し、それを任意のクラスの非静的メンバー関数にする意味がないため、freeFunct はフリー関数である必要があるとしましょう。

それを宣言する3つの異なる方法が頭に浮かびます。

3番目の解決策の方が悪いと感じています。

最初の2つに違いはありますか?

もっと良いものはありますか?

0 投票する
3 に答える
907 参照

c++ - const 参照によって渡されたオブジェクトの内部状態を変更/更新する方法

オブジェクトを const 参照で渡すということは、そのメンバーを変更できないことを意味します。しかし、オブジェクトにvector<string>メンバーが含まれているとします。メンバーも必要であり、ベクター内の次の要素を指すように読み取りごとに更新する必要があるとvector<string>仮定して、メンバーの内容を読み取るための const メソッドをどのように記述すればよいでしょうか?vector<string>::iterator

これは可能ですか、またはこの状況で別の方法がありますか? つまり、const 参照オブジェクトによって渡された内容を変更しないでください。ただし、オブジェクトはその内部状態を更新できる必要があります (つまり、ベクター内の次の要素を読み取る必要があります)。