異なるコンテナのイテレータの比較: 未定義の動作の明確化
C でイテレータを扱う場合、コンテナからのイテレータの比較の制限を理解することが重要です。異なるコンテナ。この記事では、式 foo.begin() == bar.begin() が false または未定義の動作を生成するかどうかという問題を詳しく掘り下げます。ここで、foo と bar は 2 つの別個の std::vector コンテナです。
C 11 標準 (n3337) では、異なるコンテナーの反復子を直接比較することはできません。セクション 24.2.5 では、前方反復子の等価演算子 == の定義域は、同じ基礎となるシーケンス上の反復子に対してのみ定義されると述べています。異なるコンテナは別個のシーケンスと見なされるため、それらのイテレータを比較することは未定義の動作です。
さらに、LWG 問題 #446 はこの問題に具体的に対処しています。この提案は、明示的に定義されていない限り、異なる範囲の反復子の比較が未定義であることを明確にする明示的なテキストを標準に追加することを目的としています。これは、std::find のような関数を使用するなど、異なる範囲の反復子を間接的に比較しても、未定義の動作が発生する可能性があることを強調しています。
したがって、異なるコンテナーまたは異なるコンテナーのサブ範囲の反復子を比較しないことが重要です。これを行うと、予期しない結果が生じる可能性があるため、堅牢なコードの実践では避けるべきです。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3