17

我的问题是由stackoverflow上的这个答案引起的,https://stackoverflow.com/a/48082010/5360439。去引用,

问:你如何将 a 转换std::string_view为 a const char*

答:只需执行 astd::string(string_view_object).c_str()即可获得保证的空终止临时副本(并在行尾清理它)。

不幸的是,它构建了一个新的string. 我想知道是否可以简单地做,

static_cast<string>(string_view_object).c_str()

现在,我的问题是:

  1. 这会构造一个新字符串吗?

  2. 是否保证返回一个以空字符结尾的字符序列?

我有一小段代码用于演示。它似乎工作正常。(查看魔杖盒结果

#include <string>
#include <iostream>
#include <string_view>
#include <cstring>

int main()
{
  std::string str{"0123456789"};
  std::string_view sv(str.c_str(), 5);

  std::cout << sv << std::endl;
  std::cout << static_cast<std::string>(sv) << std::endl;
  std::cout << strlen(static_cast<std::string>(sv).c_str()) << std::endl;
}
4

2 回答 2

13

static_cast<std::string>(sv)正在调用std::string::string期望任何类型可转换为std::string_view更多详细信息)的构造函数。因此,是的,它仍在创建一个全新的std::string对象,这反过来又保证了一个以空字符结尾的字符序列。

于 2019-01-16T06:28:45.493 回答
-3

检查是否static_cast<std::string>(sv)构造新字符串的一种简单方法是验证它是否能够更改原始字符串。

#include <string>
#include <iostream>
#include <string_view>
#include <cstring>

int main()
{
  std::string str{"0123456789"};
  std::string_view sv = str;

  std::cout << sv << std::endl;
  static_cast<std::string>(sv)[0] = 'a';
  std::cout << static_cast<std::string>(sv) << std::endl;
} 

sv保持不变,所以它确实创建了一个新字符串。

在魔杖盒上查看结果

于 2019-01-16T07:13:25.963 回答