問題タブ [forwarding-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++ - 値をコピーせずに複数回使用するマクロを作成するにはどうすればよいですか?
ペアを 2 つのローカル変数にアンパックするマクロを作成したいと思います。ペアが単なる変数である場合は、ペアのコピーを作成したくありません。これにより、次のことが実現します。
ただし、複数回指定された式を評価しないようにしたいと思います。たとえば、これはexpensive_computation()
1 回だけ呼び出す必要があります。
私が行った場合:
その後、ケースで機能しexpensive_computation()
ますが、ケースでコピーを作成しますx
。私が行った場合:
次にx
、コピーを作成せずにケースで動作しますが、ケースで失敗しますexpensive_computation()
。私が行った場合:
これらは両方ともコンパイルして実行しますが、未定義の動作を引き起こすと思われます-それについては正しいですか? また、これらのいずれかは意味がありますか?
これらのユース ケースの両方で機能するマクロを作成する方法はありx
ますか?
c++ - オーバーロードされたコンストラクターは、移動とコピーでは違法です
私が作成しているクラスがあり、そのコンストラクターの 1 つに特別な型を使用します。このクラスは、要件に合った任意の型にすることができます。このテンプレート化されたコンストラクターが原因で、コピー コンストラクターとムーブ コンストラクターが不正なオーバーロードになるという問題に遭遇しました。
私のクラスは次のようにレイアウトされています:
この制限を回避するにはどうすればよいですか?
c++ - const ref 型の関数引数テンプレート パラメーターがあいまいである
他の関数を呼び出すテンプレート関数に const ref パラメータを渡す際に問題があります。次のコードを検討してください。
したがって、ラッパーで呼び出したい引数をA::foo
持つメンバー関数があります。行 (1) により、次のエラーが発生します。const int&
a_caller
私の最初の質問は、なぜこれが起こるのですか?オーバーロードされていない関数 A::foo をコンパイラに与えますが、それから推論できないのはなぜArgs
ですか? 2 番目の質問は、なぜこれが std::make_unique で起こらないのかということです。次のコードは同じように見えますが、コンパイラーはコンストラクターの引数の型を問題なく推測します。
c++ - 普遍的な型の演繹 スコット・マイヤーズ
私はスコット・マイヤーズによるEffective modern C++を読んでいます
関数パラメーターであるユニバーサル参照の場合、初期化子は呼び出しサイトで提供されます。
参照が普遍的であるためには、型推論が必要ですが、それだけでは十分ではありません。参照宣言の形式も正しい必要があり、その from はかなり制約されています。正確に " " でなければなりませんT&&
。
f が呼び出されると、型T
が推定されます (呼び出し元が明示的に指定しない限り、私たちは気にしません)。しかし、param の型宣言の形式は " T&&
" ではなく、" std::vector<T>&&
" です。これにより、 param が普遍的な参照である可能性が排除されます。したがって、 param は右辺値参照であり、左辺値を渡そうとすると、コンパイラが喜んで確認します。f
上記では、次の質問があります
- 作成者が「呼び出し元が明示的に指定しない限り、私たちが関与しないエッジケース」とはどういう意味ですか? 作成者が発信者が明示的に指定していると言及しているエッジケースとは何かの例を提供するように要求します
c++ - 型制約と暗黙的な変換を C++11 ユニバーサル参照と組み合わせる方法は?
関数では、左辺値と右辺値の参照を区別する必要があるため、明らかなパスはオーバーロードすることです。
これは、適切に定義された型と暗黙の変換を備えた、まさに望ましい動作をしています。ただし、コードの重複が多すぎるため、関連する決定を内部にカプセル化し、単一の関数のみを保持することを希望するため、ユニバーサル参照による受け渡しがオプションになる場合があります。
ただし、これには不幸な欠点があり、現在は任意のオブジェクトを最初のパラメーターとして渡すことができるため、enable_if を介して制約を課すことができます。
これはほとんど仕事をしているように見えますが、(すでにテンプレート化していると思います) 暗黙的な変換コンストラクターを型 A (型 C パラメーターからなど) にトリガーできるオーバーロードの優れたプロパティを失いました。一部の関数には 3 つ以上の A&& パラメーターがあり、組み合わせの爆発を処理する意図がないため、オーバーロードはオプションではありません。暗黙の変換を何らかの方法で回復できますか? もちろん、回避策の 1 つは、たとえば、A に許可されている他のパラメーター型を追加し、メイン関数で必要な変換を実行することです。それでも変換によって右辺値を生成します)。もっと良い方法はありますか?
c++ - 転送参照とテンプレート テンプレート
次の 2 つのテンプレート関数を検討してください。
なぜ前者は (転送参照を使用して) 左辺値を受け入れ、後者は受け入れないのですか?
ID エイリアス テンプレートを転送参照にすることはできますか? これにも関連している可能性がありますが、参照の転送に関する制限の別の側面をカバーしているようです.