問題タブ [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 投票する
5 に答える
13141 参照

c++ - Why is it allowed to pass R-Values by const reference but not by normal reference?

The following program

will work if called with a literal like this

but without the const it won't work.

So how can a const reference keep pointing to an R-Value (anonymous variable)?

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

c++ - C++の一時変数と定数の違いは何ですか?

最初に私のコードを投稿させてください:

Fun(iTest);新しい一時変数(タイプキャスト)が生成されることはわかっていますが、一時変数は定数でしょうか?

いいえの場合: temp 変数を渡せないのはなぜですか?short &

はいの場合: 次のような別のコードがあります。

によって返される一時変数MOCreator() が定数の場合、一時変数が非定数メンバー関数を呼び出すことができるのはなぜですか?

私の質問は:</p>

1) C++の一時変数定数の違いは何ですか?

2) Thinking in C++ (page 507)に一文があります。文は正しいですか?なぜ?:

一時オブジェクトは自動的にconstになります

誰かから簡単な質問をされましたが、その質問を解決する途中でさらに質問に遭遇しました。私はそれらが非常に一般的な質問である可能性があることを知っており、ネットで長い間検索しています. また、さまざまな回答をいただきました。しかし、私は今それについてもっと混乱しています。

前もって感謝します。

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

c++ - テンプレート化された数学関数は、値または const 参照を取る必要がありますか?

単純な数学関数を実装したいとします。たとえば、 (C++17's) の再実装であるとしますstd::clamp。この関数は、数値、下限、および上限を取り、それらが定義する範囲外の場合、数値をそれらの境界の 1 つに設定します。具体的な数値型の場合、たとえばint、次のように記述します。

しかし、それがテンプレートの場合、おそらく標準で使用されるサンプル実装const&では、値ではなく が使用されていることがわかります。したがって、引用を簡単にするために、次のようにします。

私の質問は次のとおりです。

  • T単純な数値型であるに対して const 参照を使用する利点はありますか?
  • 同上、単一の数値をデータメンバーとしてラップする抽象的なものである型(たとえば、std::chrono期間)の場合は?
  • const&比較的単純な(constexpr?)、副作用のない数学的な関数の一般的なケースで、値を取る方が(そしてまったく)良い考えなのはなぜですか?

ノート:

  • const&たとえば、ある種の k 次元のベクトル型、またはboost::rationals やその他の数値のような型がある場合、 a を使用することが理にかなっていることに気付きました。それでも、コンパイラはコピーを最適化しないでしょうか?
  • 私は、任意の C++ 関数について質問しているわけではなく、そのパラメーターを値で受け取るだけでよいかどうかを尋ねているわけではありません。それは明らかに悪い考えです。
0 投票する
2 に答える
111 参照

c++ - const ref 型パラメーターで一時オブジェクトを使用する場合、コンパイラーは安全でない動作について警告する必要がありますか?

次の不適切なコードを考えてみましょう。

g++ 6.3.0 as clang 3.8.1 は警告なしでこのコードをコンパイルし-W -Wall -Werrorます。

単純に期待できる結果が得られないのはなぜですか? std::stringから作成されたオブジェクトの有効期間は const char *、コンストラクターのスコープに制限されます。したがって、foo()コンストラクターが戻ると、foo::sフィールドには存在しないオブジェクトへの参照があります。カブーム。

誰かがアイデアを理解していれば、修正を導入するのは簡単です。オブジェクトを明示的に作成std::stringし、それをパラメーターとして渡すことができます。

foo::sもう1つは、フィールド宣言を次のように変更することで、少し安全だと思います。

パラメータの変更不可能なローカル コピーを作成しますが、オブジェクトをコピーするコストが追加されます。さて、この例では std::string をコピーしても自動的にディープ コピーが作成されるわけではありませんが、独自に実装されたクラスの場合はまったく別の問題になる可能性があります。

C++11 の場合、この回答で指定されているように、利用可能な他の方法はほとんどありませんが、たとえば、組み込み Linux 環境では、古いコンパイラといくつかのレガシー コードにこだわっている場合、必ずしも重要なオプションではありません。

ただし、プログラマーがどのような解決策を選択するにしても、問題があることを知っておく必要があります。const char *自分のコードを適切に書いたとしても、他の開発者がパラメーターを渡すという罠に陥った場合、コンパイラーはそのような状況を明らかに危険なものとして検出するのに十分賢明であると漠然と思っていました。しかし、コンパイラの動作をチェックするコードを書くことにしましたが、がっかりしました。既に存在しないオブジェクトへの参照を持つという罠に陥りやすいのです。

一時オブジェクトを const 参照として渡すことは危険であると認識されており、C++11 では何らかの形で対処されていますが、そのような動作に積極的に対抗する責任は依然としてプログラマーに委ねられています。それで、コンパイラからの警告を期待するのは合理的ですか、それとも外部の静的分析ツールに頼るべきですか?

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

c++ - リテラルを const ref パラメーターとして渡す

次の単純化されたコードを想像してください。

(1) 最適化はさておき、42 が に渡されるとどうなりfooますか?

コンパイラは 42 をどこかに (スタック上の?) 貼り付けて、そのアドレスを に渡しますfooか?

(1a) この状況で何をすべきかを指示する標準に何かありますか (または厳密にはコンパイラ次第ですか)?


ここで、少し異なるコードを想像してください。

私が定義しない限り、リンクしませんint bar::baz;(ODRのため?)。

(2) ODR 以外に、上記の 42 で行ったことをコンパイラーが実行できないのはなぜですか?


単純化する明白な方法は、次のように定義することですfoo

ただし、テンプレートの場合はどうすればよいでしょうか。例えば:

(3)プリミティブ型を値でfoo受け入れるように指示するエレガントな方法はありますか? xそれとも、SFINAEなどで特化する必要がありますか?

編集foo:この質問とは無関係であるため、内部で何が起こるかを変更しました。