Skip to content
Go back

C++:Ref-Qualifiersとthisポインタ

· Updated:
  • C++11から、呼出元の参照修飾に応じて、メンバー関数のオーバーロード解決を行わせる機能が使えるようになった
    • 関数宣言で、constの後、かつ、noexceptの前に記述する
      • void foo(...) const && noexcept {...}
    • &はlvalue referenceに、&&はrvalue referenceに対応する
  • しかし、これがあっても、クラス内部ではlvalue版が常に呼び出される
    • thisポインタの解釈に変更はなく、常にlvalueであるため
    • なので、rvalue版を呼び出すには、*thisをムーブするなどの必要がある
  • C++23から、”Deducing this”と呼ばれる機能が使えるので、これらを簡単に解決できるようになる
    • cvやrefを指定して*thisを引数として受け取ることができる
      • 例えば、void foo(this const Foo&& self, ...)void foo(...) const&&と同じ
    • forwarding referenceでも受け取れるので、1つの定義のみですべてのパターンを網羅できる
      • void foo(this auto&& self, ...)
      • cvとrefを転送するforward_like<T>関数も用意される
  • 参考:https://en.cppreference.com/w/cpp/language/member_functions