「&s[0]」は std::string 内の連続した文字を参照しますか?
C では、「&s[0]」を使用します" std::string の最初の文字にアクセスすることは一般的に行われてきましたが、この文脈ではその安全性に関して懸念が生じます。この問題に対処するには、std::string の基礎となるストレージ スキームを理解することが重要です。
C 98/03 標準では、std::string の割り当てに連続ストレージを強制していないため、実装で断片化されたメモリを使用することが可能になりました。 。ただし、C 11 の登場により、連続ストレージは std::string の必須要件になりました。
実際には、連続ストレージのアプローチから逸脱する実装に遭遇する可能性はほとんどありません。 Herb Sutter 氏が認めているように、この規則に違反する既知の実装はありません。
したがって、「&s[0]」を使用して std::string の最初の文字を参照することは、C 98/03 と C 11 の両方で安全です。 C 11 標準では、長さがゼロの文字列であっても、この動作が明示的に保証されています。これは、operator[]:
Returns: *(begin() + pos) if pos < size(), otherwise a reference to an object of type T with value charT(); the referenced value shall not be modified
の定義から明らかです。さらに、data() 関数は次のように定義されています:
Returns: A pointer p such that p + i == &operator[](i) for each i in [0, size()].
これらの定義は、"&s" を通じて取得された参照が確認されることを確認します。 [0]" は文字列内の有効な文字を指します。最新の C 実装ではデフォルトで連続しています。
以上が`&s[0]` は C の std::string の最初の文字にアクセスする安全な方法ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。