このページはC++23に採用された言語機能の変更を解説しています。
のちのC++規格でさらに変更される場合があるため関連項目を参照してください。
概要
以下の演算子がthisポインタを必要としない (状態をもたない) 場合、演算子オーバーロードをstaticとして定義できる:
operator()(関数呼び出し演算子)operator[](添字演算子)
またラムダ式においても同様に、staticをつけられるようになる。staticをつけた場合、以下のようになる:
mutableを同時に指定することはできないconstメンバ関数ではなくなる
これらをstaticとして定義することで、演算子の呼び出しが高速化することを期待できる。
例
出力
1
1
1
この機能が必要になった背景・経緯
関数オブジェクトは関数ポインタに比べてインライン化しやすいため、パフォーマンスで有利である。しかし、関数オブジェクトがなんらかの理由でインライン化されない場合に、thisポインタを渡すための余分なレジスタを使わなければならない。
状態をもたない関数オブジェクトではthisポインタの受け渡しは必要なく、無駄である。必要ないもののためにコストを支払わないという基本的な思想に反していたため、thisポインタの受け渡しをなくせる機能として、static指定の許可を導入した。