C++ 将函数参数“const char*”转换为“std::string\u view”安全吗?

C++ 将函数参数“const char*”转换为“std::string\u view”安全吗?,c++,c++17,null-terminated,string-view,C++,C++17,Null Terminated,String View,标题几乎说明了一切 void f(const char*) 到 安全吗?如果没有,陷阱是什么 std::string\u view语义规定数组不一定以null结尾,这在f中可能是一个真正的问题,因为已经考虑到了这一点(例如,如果将原始指针传递到f中预期以null结尾的函数上) 安全吗 是的,只要它是正确的,它是安全的。如果有人给你垃圾,你仍然会有垃圾 陷阱是什么 正如您所说,std::string\u view不需要以null结尾。如果您在调用链的某个地方需要一个以null结尾的c字符串,那么

标题几乎说明了一切

void f(const char*)

安全吗?如果没有,陷阱是什么

std::string\u view
语义规定数组不一定以null结尾,这在
f
中可能是一个真正的问题,因为已经考虑到了这一点(例如,如果将原始指针传递到
f
中预期以null结尾的函数上)

安全吗

是的,只要它是正确的,它是安全的。如果有人给你垃圾,你仍然会有垃圾

陷阱是什么

正如您所说,
std::string\u view
不需要以null结尾。如果您在调用链的某个地方需要一个以null结尾的c字符串,那么您不能使用它,因为您不能保证会有一个

安全吗

不一般

如果没有,陷阱是什么

这:

std::string_视图语义规定数组不一定以null结尾,这在f中可能是一个真正的问题,因为已经考虑到了这一点(例如,如果原始指针被传递到一个函数上,该函数在f中预期以null结尾)

只要函数的实现不依赖于空终止,更改是安全的

但是,如果实现确实依赖于空终止,那么在该实现更改之前,更改将是不安全的


假设函数的实现不依赖于null终止将是不安全的。< / P>在C++中没有什么是“安全的”。你必须充分理解每个变化的含义。只有你才能知道这在你的特定程序中是否“安全”。也许是,也许不是,只有你有机会访问完整的程序,只有你能理解出来。SAMVARSHIVCHIK问题是在普遍接受的语义的上下文中。问题是,如果你问两个C++开发者是否“X”是“普遍接受”,您将得到三个不同的答案。您将在注释部分得到它们。根据字符串的预期大小,您可能只希望使用

void f(std::string)
。复制线性数据(类似于数组)非常快,因此您甚至可能会根据用例注意到副本。它不仅仅是一个副本,它还[可能]是一个动态分配和一些间接操作。这就增加了,
constchar*
也没有这样的保证。事实上,问题不在调用链的下游,它被“移动”到了这里,因为从
const char*
构造一个
string\u视图
而不带长度参数需要
const char*
指向一个终止的缓冲区;
f
的前提条件是参数以null结尾,因为我们没有提供长度参数。至于这是否会改变“安全性”,我们同样可以保证原来的
const char*
pointee是以null结尾的。实际的问题是,如果不是,到
string\u视图的转换可能有UB,因此如果
f
以前不依赖被终止的输入,现在就有了UB。所以这和你说的正好相反;)
已经有一个f的先决条件,即参数以null结尾
这正是导致更改不安全的原因:它删除了该先决条件。如果函数的实现依赖于该前提条件,那么这就是一个问题
如果不是,转换到string_视图可能有UB
它被很好地定义为构造一个以非空结尾的
std::string_视图
如果f以前不依赖被终止的输入,现在就依赖了。
API绝对不能保证更改后输入被null终止。它不会删除该前提条件。函数的前提条件不限于其参数类型的前提条件。可以推断,
f
的先决条件必须是其参数是指向以null结尾的缓冲区的指针(即使
const char*
本身不需要这样做)。此代码更改并没有内在地改变该前提条件。“它被完美地定义为构造一个以非空结尾的std::string_视图。”不是从
常量char*
(没有大小参数)开始的,它不是。想想这是怎么回事。然后咨询;)@这是一个技术问题。前提条件“std::string_视图
必须引用以null结尾的字符串”是一个愚蠢的前提条件,它不应该存在。
void f(std::string_view)