• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    thisポインタをもつ必要のない演算子をstaticとして宣言できるようにする [P1169R4]

    このページは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指定の許可を導入した。

    関連項目

    参照