簡體   English   中英

std :: string_view文字是否保證以null結尾?

[英]Is a std::string_view literal guaranteed to be null-terminated?

我知道一個簡單的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()以空值終止?

===以下更新===

以下全部來自n4820

  1. 根據5.13.5.14,字符串文字以空值終止。
  2. 根據5.13.8,用戶定義的字符串文字由字符串文字加上自定義后綴組成。 說, "hello"svhello是字符串文字, sv是后綴。
  3. 根據5.13.8.5, "hello"sv被視為表單operator "" sv(str, len);的調用operator "" sv(str, len); 根據5.13.5.14, str是以null結尾的。
  4. 根據21.4.2.1, svdata()必須返回str

他們能否證明"hello"sv.data()是否被C ++標准保證為空終止?

所以讓我們把簡單的部分放在一邊。 沒有string_view永遠是“NUL終止的”,在這個意義上,對象代表一個大小的字符范圍。 即使您從NUL終止的字符序列創建string_viewstring_view 本身仍然不是“NUL終止”。

您真正要問的問題是:實現是否有一些余地使語句"some literal"sv產生一個string_viewdata成員指向由"some literal"表示的以NUL結尾的字符串文字? 就是這樣:

string_view s = "some literal"sv;

允許以任何不同的方式行事:

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}

這是該函數行為的標准規范:它返回一個string_view ,它指向str提供的內存。 因此,實現不能分配一些隱藏的內存並使用它或其他任何東西; 返回的string_view::data 需要返回與str相同的指針。

現在,這給我們帶來了一個不同的問題: str 需要是一個以NUL結尾的字符串? 也就是說,編譯器看到你正在使用sv UDL實現是否合法,因此從它要為str傳遞的字符串文字創建的數組中刪除NUL字符?

讓我們看看字符串的UDL如何工作

如果L是用戶定義的字符串文字,則令str沒有其ud后綴文字,並且lenstr的代碼單元數(即,其長度不包括終止空字符 )。 文字L被視為表格的調用

 operator "" X(str, len) 

請注意我強調的短語。 我們知道“沒有ud后綴的文字”的行為。 第二個短語特別提到了str的預期NUL終結符。 我會說這是一個非常明確的聲明, str將被賦予一個字符串。 並且該文字字符串將根據C ++中的常規字符串文字規則構建,因此將以NUL終止。

鑒於上述情況,我認為可以肯定地說,這里的實施沒有余地。 UDL返回的string_view 必須指向由UDL中指定的字符串文字定義的數組,並且與任何其他字符串文字一樣,該數組將以 NUL終止。

話雖如此, 查看我的第一段。 您不應該編寫任何假定string_view以NUL終止的代碼。 即使string_view的創建者和消費者彼此相鄰,我也會稱它為代碼味道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM