我的问题是由关于栈溢出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()
现在,我的问题是:
这会构造一个新的字符串吗?
是否保证返回以空值结尾的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;
}
答案 0 :(得分:12)
static_cast<std::string>(sv)
正在调用std::string::string
构造函数,该构造函数期望可转换为std::string_view
(more 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.的结果