1. ホーム
  2. c++

[解決済み] C++20でstd::ssize()が導入された理由は何ですか?

2022-11-15 07:34:57

疑問点

C++20 が導入され std::ssize() フリー関数が導入されました。

template <class C>
    constexpr auto ssize(const C& c)
        -> std::common_type_t<std::ptrdiff_t,
                              std::make_signed_t<decltype(c.size())>>;

可能な実装は static_cast の戻り値を変換するために size() のメンバ関数である ass C を符号付きの対応する関数に変換します。

のため size() のメンバー関数は常に非負の値を返すので、なぜそれを符号付き変数に格納したいと思うのでしょうか?本当にそうしたいのであれば、単純に static_cast .

なぜ std::ssize() は C++20 で導入されたのですか?

どのように解決するのですか?

その根拠は この論文 . 引用です。

span が C++17 に採用されたとき、インデックスとサイズの両方として符号付き整数が使用されました。これは、コンパイル時にサイズが不明な型を示すためのセンチネル値として "-1" を使用できるようにするためでもありました。しかし、STLコンテナのsize()関数が符号付き値を返すことは問題であり、P1089はこの問題を修正するために導入されました。これは大多数の支持を得ましたが、コンセンサスに必要な 2 対 1 のマージンではありませんでした。

この論文、P1227 は、非メンバーの std::ssize およびメンバーの ssize() 関数を追加する提案でした。これらを含めることで、特定のコードをより簡単にし、サイズ計算における不要な符号なしを回避することが可能になります。ssize() が std::ssize() とメンバー関数の両方を通じてすべてのコンテナーで利用可能になれば、P1089 に対する抵抗が減少するという考えです。