このページはC++20に採用された言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
C++11でメンバ関数を左辺値/右辺値修飾する機能が導入された。その際、以下の例において、同じ関数を呼び出す場合でも、メンバ関数ポインタを介した方だけが不適格となっていた:
struct X { void foo() const&; };
X{}.foo(); // OK
(X{}.*&X::foo)(); // コンパイルエラー!
これは、「.*
式において、右辺値オブジェクトに対して左辺値修飾されたメンバ関数ポインタを呼び出すことは不適格となる」という仕様によるものであった。
C++20ではこの式が許可され、仕様としては以下のようにconst
メンバ関数の呼び出しを許可するようになった:
「.*
式において、右辺値オブジェクトに対して左辺値修飾された非const
のメンバ関数ポインタを呼び出すことは不適格となる」