我正在使用一个内部库,该库旨在模仿拟议的C ++库,并且在过去几年中的某个时候,我看到其接口已从使用更改std::string
为string_view
。
因此,我忠实地更改了代码,以适应新的界面。不幸的是,我必须传递的是std :: string参数,以及返回的std :: string值。所以我的代码从这样的事情改变了:
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
至
void one_time_setup(const std::string & p1, int p2) {
api_class api;
const std::string p2_storage(special_number_to_string(p2));
api.setup (string_view(&p1[0], p1.size()), string_view(&p2_storage[0], p2_storage.size()));
}
除了更多的代码(可能搞砸了)之外,我真的看不到这种变化给我作为API客户端带来了什么。API调用不太安全(由于API不再拥有其参数的存储空间),可能保存了我的程序0的工作(由于编译器现在可以进行移动优化),即使确实保存了工作,也只能在启动后或在某个地方的大循环中,将不会并且永远不会完成的一些分配。不适用于此API。
但是,这种方法似乎遵循我在其他地方看到的建议,例如,以下答案:
顺便说一句,从C ++ 17开始,您应该避免传递const std :: string&,而推荐使用std :: string_view:
我发现该建议令人惊讶,因为它似乎在倡导以安全性较低的对象(基本上是经过修饰的指针和长度)普遍替换为相对安全的对象,主要是出于优化目的。
那么什么时候应该使用 string_view,什么时候不应该使用?
<string>
标题中,并且自动发生。该代码具有欺骗性和错误性。
std::string_view
直接调用构造函数,只需将字符串传递给采用std::string_view
直接方法的方法,它将自动转换。