些細な_std::string_view
_がnullで終了することが保証されていないことを知っています。ただし、_std::string_view
_リテラルがnullで終了することが保証されているかどうかはわかりません。
例えば:
_#include <string_view>
using namespace std::literals;
int main()
{
auto my_sv = "hello"sv;
}
_
C++ 17以降では、my_sv.data()
がnullで終了することが保証されていますか?
===以下を更新します===
以下はすべて n482 からのものです。
- 5.13.5.14に従い、文字列リテラルはnullで終了します。
- 5.13.8に従って、user-defined-string-literalは文字列リテラルとカスタムサフィックスで構成されます。たとえば、_
"hello"sv
_、hello
は文字列リテラル、sv
はサフィックスです。- 5.13.8.5に従い、_
"hello"sv
_は5.13.5.14のようにoperator "" sv(str, len);
の形式の呼び出しとして扱われ、str
はnullで終了します。- 21.4.2.1に従い、
sv
のdata()
はstr
を返す必要があります。
"hello"sv.data()
がC++標準によってnullで終了することが保証されていることを証明できますか?
では、簡単な部分を邪魔にならないようにしましょう。オブジェクトが特定のサイズの文字範囲を表すという意味で、_string_view
_が「NULで終了する」ことはありません。 NULで終了する文字のシーケンスから_string_view
_を作成しても、_string_view
_itselfはまだ「NULで終了」されていません。
あなたが本当に尋ねている質問はこれです:実装はステートメント_"some literal"sv
_に_string_view
_を生成する余裕がありますか?data
メンバーdoes not_"some literal"
_で表されるNULで終了する文字列リテラルを指すつまり、これは:
_string_view s = "some literal"sv;
_
any wayとは異なる動作が許可されています:
_const char *lit = "some literal";
string_view s(lit, <number of chars in of lit>);
_
後者の場合、s.data()
は文字列リテラルへのポインターであることが保証されているため、そのポインターをNUL終了文字列へのポインターとして扱うことができます。前者も同様に有効であるかどうかを尋ねています。
調べてみましょう。 _operator""sv
_オーバーロードの定義は次のように記述されています :
_constexpr string_view operator""sv(const char* str, size_t len) noexcept;
_戻り値:_
string_view{str, len}
_。
これは、この関数の動作の標準仕様です。str
によって提供されるメモリを指す_string_view
_を返します。したがって、実装はいくつかの隠しメモリを割り当てて、それを使用することはできません。返された_string_view::data
_/ str
と同じポインタを返すには、が必要です。
さて、これは別の質問に導きます:str
requiredはNULで終了する文字列ですか?つまり、コンパイラがsv
UDL実装を使用していることを認識しているため、str
として渡された文字列リテラル用に作成しようとしていた配列からNUL文字を削除できます。 ?
文字列のUDLの仕組み を見てみましょう。
L
がユーザー定義の文字列リテラルの場合、str
をd-suffixなしのリテラルとし、len
を数値にしますstr
内のコード単位の数(つまり、長さ終端のヌル文字を除く)。リテラルL
は、次の形式の呼び出しとして扱われます_operator "" X(str, len)
_
私が強調したフレーズに注意してください。 「ud接尾辞のないリテラル」の動作はわかっています。そして、2番目の句は、str
に期待されるNULターミネーターについて具体的に述べています。これは、str
にリテラル文字列が与えられるというかなり明確なステートメントだと思います。そして、そのリテラル文字列は、C++の通常の文字列リテラルルールに従って作成されるため、NULで終了します。
以上を踏まえると、ここで実装する余地はないと言っても差し支えないと思います。 UDLによって返される_string_view
_mustは、UDLで指定された文字列リテラルによって定義された配列を指し、他の文字列リテラルと同様に、その配列willはNULで終了します。
please最初の段落を確認してください。 _string_view
_がNULで終了することを前提とするコードは記述しないでください。 _string_view
_の作成者であり、コンシューマーである場合でも、コードの匂いと呼んでもかまいません。