[解決済み] 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 に対する抵抗が減少するという考えです。
関連
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] std::vector に対する反復処理: 符号なしインデックス変数と符号ありインデックス変数の比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】C++の余分な資格エラー
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】変数やフィールドがvoid宣言されている