将string_view_cast转换为字符串是否合法

时间:2019-01-16 06:22:01

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

我的问题是由关于栈溢出https://stackoverflow.com/a/48082010/5360439的答案引起的。引用

  

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

     

A:只需执行std::string(string_view_object).c_str()即可获得有保证的以空值终止的临时副本(并在行尾将其清除)。

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

static_cast<string>(string_view_object).c_str()

现在,我的问题是:

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

  2. 是否保证返回以空值结尾的char序列?

我有一小段代码用于演示。似乎工作正常。 (请参阅wandbox 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;
}

2 个答案:

答案 0 :(得分:12)

static_cast<std::string>(sv)正在调用std::string::string构造函数,该构造函数期望可转换为std::string_viewmore details)的任何类型。因此,是的,它仍在创建一个全新的std::string对象,从而保证了以null终止的char序列。

答案 1 :(得分:-3)

检查from django.urls import path,include from django.contrib import admin from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), path('', include("myapp.urls")), path('accounts/', include('django.contrib.auth.urls')) ] if settings.DEBUG: urlpatterns += (static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)) 是否构造新字符串的一种简单方法是验证它是否能够更改原始字符串。

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; } 保持不变,因此会创建一个新字符串。

查看有关wandbox.的结果