【问题标题】:Is it legal to static_cast a string_view to a string将 string_view 静态转换为字符串是否合法
【发布时间】:2019-01-16 06:22:01
【问题描述】:

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

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

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

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

static_cast<string>(string_view_object).c_str()

现在,我的问题是:

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

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

我有一小段代码用于演示。它似乎工作正常。 (参见魔杖盒results

#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;
}

【问题讨论】:

  • 是的,这也会创建一个临时的string 对象。我不知道您希望如何在没有副本的情况下将内容放在 NUL 字符旁边。
  • static_cast&lt;T&gt;(o)T(o) 几乎相同。
  • 请不要在有人发布答案后添加基本上回答您问题的验证。它使那个人的努力无效。如果问题的回答令您满意,请接受该答案。或者用您自己的解决方案发布另一个答案。 SO 是一个问答网站。问题属于问题框,答案属于答案部分。
  • @StoryTeller 抱歉,我并不是要让其他人的努力无效。我以前从未回答过我的问题,所以我的第一个想法是通过编辑问题来发布我的答案。感谢您向我解释规则。
  • 不用担心。我知道没有恶意。如果您想出一些对自己有用的东西并认为其他人可能会受益,也不要害怕回答自己的问题。实际上是highly encouraged :)

标签: c++ static-cast string-view


【解决方案1】:

static_cast&lt;std::string&gt;(sv) 正在调用 std::string::string 构造函数,该构造函数期望任何可转换为 std::string_view (more details) 的类型。因此,是的,它仍在创建一个全新的std::string 对象,这反过来又保证了一个以空字符结尾的字符序列。

【讨论】:

  • 我会说“是的,是的”(OP问了两个问题)。
  • 字符串不是以空值结尾的。是 c_str() 函数在末尾添加了 null。
  • std::string 的内部状态可能不包含以空字符结尾的字符串,但它的接口提供了一个,即data()c_str() 都保证返回指向空字符的指针- char 的终止数组。
【解决方案2】:

检查static_cast&lt;std::string&gt;(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 保持不变,因此它确实创建了一个新字符串。

wandbox.上查看结果

【讨论】:

  • 您必须小心“试试看”的方法,尤其是在涉及字符串时。例如 const char* s = "hello"; 后跟 const_cast 并尝试通过数组索引修改该字符串 sometimes 有效,但实际上行为未定义。最好的办法是检查文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多