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