問題タブ [ref-qualifier]
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++ - メンバー関数の cv-ref-qualifier の転送
(メンバー) 関数 templateの別のオーバーロード (f(T &)
または など)がない場合、はいわゆる転送参照であり、cv 修飾型の、 またはのいずれかです。しかし、メンバー関数のcv-ref-qualifiersにはそのような規則はありません。has always 右辺値参照修飾子。f(volatile T &&)
template< typename T > f(T &&);
T &&
T
U
U &
U
struct S { void f() && { ; } };
S::f()
volatile
一般的なコードでは、すべてのメンバー関数が一般的に同じことを行う場合に、メンバー関数の 4 つ (または修飾子も考慮すると 8 つ) のオーバーロードの定義を避けることが非常に便利です。
この方法で発生するもう 1 つの問題は、特定の意味で有効なcv-ref-qualifierを定義することが不可能であるということです。次のコードでは、メンバー関数のref-qualifierがofである*this
かどうかを判断できません。operator ()
&&
&
しかし、上記の構文があれば、とてもいいでしょう。つまり、 のdecltype((*this))
正確なcv-ref 修飾型を示し*this
ます。私の考えでは、 C++標準の今後のバージョンにこのような構文を導入することは、重大な変更ではありません。しかし&&
、cv-ref-qualifier の転送は (そして、委員会 (つまり、コア言語ワーキング グループ) の省略のように見えます)。
メンバー関数cv-ref-qualifierとcv-ref-qualified型の両方*this
をその本体に示す別のシーケンスが可能です:auto &&
などdecltype(&&)
。
C++17で使用するために準備された、この問題に関する提案はありますか?
c++ - 参照修飾子と削除されたメンバー メソッド
次のコードを検討してください。
もちろん、メンバーメソッドをオーバーロードできないと言ってコンパイルしません。もちろん、それは理にかなっています。
反対側では、次のコードがコンパイルされます。
それは法規ですか?
同じクラス内で 2 つの完全に異なるインターフェイスを定義することは可能ではないでしょうか。前者は左辺値で使用され、後者は右辺値で使用されますか?
それがあまり意味をなさないという事実は別として、それは本当に私を傷つけます. 削除された関数は、左辺値の場合にのみ削除する
のではなく、全体として削除するべきではありませんか?
この機能の目的は何ですか? それは古典的な目立たないコーナーケースですか、それとも私には見えない何かがありますか?
c++ - ref 修飾メンバーのテンプレート インスタンス化のエラー
別のコンパイル (*.hh、*.cc、*.ie、およびメイン) に分割しようとする場合を除いて、コードは実行されます。(コメントアウトされた) ステートメントは、コンパイラ ICE を発行します。
インスタンス化の構文に問題はありません。誰かがこれについて私を助けてくれませんか...
c++ - 末尾の戻り型、declval、および参照修飾子: 一緒に機能しますか?
次の例を検討してください。
B
(行) で呼び出されると、コードは、特定のケースで右辺値参照型に変換する(*)
ためにコンパイルされなくなります。
次のように少し変更すると、逆の問題が発生します。std::declval
T
現在、特定のケースで型を左辺値参照型に変換する(*)
ための行は機能しません。std::declval
参照修飾子に関係なくT
、メンバー function がある場合に型を受け入れる式を定義する方法はありますか?f
私はそれを使用する実際のケースはなく、実際の使用例を作成することはできません.
この質問は好奇心のためであり、それ以上のものではありません。ref-qualifier
がある
場合には理由があることを理解しており、クラスの設計を壊そうとするべきではありません。
c++ - メンバー関数の完全転送と参照修飾子
C++11 では、メンバー関数を参照修飾する機能と、完全な転送が導入されました。しかし、それらを混ぜ合わせることはできますか?
この(実際の)例を考えてみましょう:
内部main()
では、最初の呼び出しでバージョン 1 または が呼び出さbar::do_stuff()
れ、2 番目の呼び出しでバージョン 2 または が呼び出されますbar::do_stuff()
。にコードの重複がありますfoo::do_stuff()
。ref-qualifiers が暗黙の 以外の引数用である場合、*this
完全な転送を簡単に行うことができます。
*this
オブジェクトを完全に転送する同等の方法はありますか?
注: 適切な解決策が C++14 または C++17 にのみ存在する場合は、私も知りたいです。
c++ - r-value ref-qualified メソッドから移動するか、移動しないか?
次の C++11+ コードでは、どの return ステートメントの構造を優先する必要がありますか?
c++ - r-value ref-qualified メソッドから r-value 参照を返すことは良い習慣ですか?
私が見ることができるように、一般的なルールは、関数から r 値参照をまったく返さないことです (まれな特殊なケースを除く)。しかし、クラス メソッドはどうでしょうか。
std::optional<T>::operator*()
C++ 標準ライブラリには、クラスの右辺値参照修飾メソッド (およびクラスstd::optional<T>::value()
のメソッド) から右辺値参照を返す例がありますstd::optional<T>
。C++17 標準のセクション23.6.3 Class template optional [optional.optional]および23.6.3.5 Observers [optional.observe]を参照してください。