[英]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 :
- 根據5.13.5.14,字符串文字以空值終止。
- 根據5.13.8,用戶定義的字符串文字由字符串文字加上自定義后綴組成。 說,
"hello"sv
,hello
是字符串文字,sv
是后綴。- 根據5.13.8.5,
"hello"sv
被視為表單operator "" sv(str, len);
的調用operator "" sv(str, len);
根據5.13.5.14,str
是以null結尾的。- 根據21.4.2.1,
sv
的data()
必須返回str
。
他們能否證明"hello"sv.data()
是否被C ++標准保證為空終止?
所以讓我們把簡單的部分放在一邊。 沒有string_view
永遠是“NUL終止的”,在這個意義上,對象代表一個大小的字符范圍。 即使您從NUL終止的字符序列創建string_view
, string_view
本身仍然不是“NUL終止”。
您真正要問的問題是:實現是否有一些余地使語句"some literal"sv
產生一個string_view
其data
成員不指向由"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后綴的文字,並且len
為str
的代碼單元數(即,其長度不包括終止空字符 )。 文字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.