15
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C++Advent Calendar 2022

Day 11

C++23からできる演算子オーバーロード

Last updated at Posted at 2022-12-10

はじめに

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にできる
15
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?