是否保证std :: string_view文字为空终止?

时间:2019-07-29 09:02:53

标签: c++ string c++17 standards string-view

我知道,平凡的std::string_view不能保证以null结尾。但是,我不知道是否可以保证std::string_view文字为空终止。

例如:

#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.   
  3. 按照5.13.8,用户定义的字符串文字由字符串文字和自定义后缀组成。假设"hello"svhello是字符串文字,后缀sv
  4.   
  5. 根据5.13.8.5,根据{5.13.5.14,"hello"sv被视为格式为operator "" sv(str, len);的调用,str被视为   空终止。
  6.   
  7. 根据21.4.2.1,sv的{​​{1}}必须返回data()
  8.   

他们能否证明str被C ++标准保证为空终止?

1 个答案:

答案 0 :(得分:9)

因此,让我们将简单的部分排除在外。从对象表示一定范围的字符的意义上讲,string_view从来都不是“ NUL终止”的。即使您从NUL终止的字符序列创建string_viewstring_view 本身仍然不是“ NUL终止”。

您真正要问的问题是:该实现是否有一些余地使语句"some literal"sv产生一个string_view成员{em>否的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终止的字符串的指针。您在问前者是否同样有效。

让我们调查一下。 definition for the operator""sv overloads are stated to be

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字符,是否合法? / p>

让我们看看how UDLs for strings work

  

如果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的创建者和使用者都是紧挨着的,我也将其称为代码气味。

相关问题