最終更新日時(UTC): 2025年07月10日 01時26分30秒
Koichi Murase が更新

履歴 編集

# const修飾されたメンバポインタの制限を修正 [P0704R1](C++20)

このページはC++20に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

C++11でメンバ関数を左辺値／右辺値修飾する機能が導入された。その際、以下の例において、同じ関数を呼び出す場合でも、メンバ関数ポインタを介した方だけが不適格となっていた：

    struct X { void foo() const&; };

    X{}.foo();        // OK
    (X{}.*&X::foo)(); // コンパイルエラー！

これは、「`.*`式において、右辺値オブジェクトに対して左辺値修飾されたメンバ関数ポインタを呼び出すことは不適格となる」という仕様によるものであった。

C++20ではこの式が許可され、仕様としては以下のように`const`メンバ関数の呼び出しを許可するようになった：

「`.*`式において、右辺値オブジェクトに対して左辺値修飾された非`const`のメンバ関数ポインタを呼び出すことは不適格となる」

## 関連項目

- C++11 メンバ関数の左辺値／右辺値修飾

## 参照

- P0704R1 Fixing const-qualified pointers to members