はじめに
C++にはたくさんの演算子オーバーロードが用意されています。
小ネタになりますが、演算子オーバーロード周りでC++23から新しくできるようになる事を紹介します。
operator[]
の複数引数
operator[]
の引数を複数にすることができるようになります。
struct Array3D
{
// 複数引数 OK
auto operator[](size_t x, size_t y, size_t z)
{
// something
}
};
多次元配列クラスへのアクセス等で便利です。
C++20以前でも呼び出し側では ar[1, 2, 3]
のような書き方がコンパイルは通りますが、コンマ演算子として解釈されてar[3]
と同等になってしまいます。
※C++20からは非推奨になっています。
static operator()
, static operator[]
C++23から、operator()
とoperator[]
の演算子オーバーロードをstatic
にすることができるようになります。
struct FunctionObject
{
// staticにできるようになった
static auto operator()()
{
// something
}
static auto operator[]()
{
// something
}
};
C++20で追加されたCPOなど、標準ライブラリ等でも関数オブジェクトは多く使われてきましたが、そのほとんどがメンバを持たないものでした。
しかし、関数呼び出しにはthisポインタ分のオーバーヘッドが生じていたため
staticにすることで、これを回避できるようになります。
ラムダ式
ラムダ式でもstatic operator()
にすることが可能です。
auto f = []() static {
// something
};
キャプチャをする場合はstatic
にできないことに注意
参考
まとめ
C++23から以下の演算子オーバーロードが新たに可能になりました
-
operator[]
の複数引数 -
static operator()
,static operator[]
- ラムダ式も
static
にできる
- ラムダ式も