C++中如何禁止字符串拼接结果转const&避免悬垂string_view
临时字符串转string_view的悬垂问题与解决方案
问题背景与描述
假设我们给std::string_view添加了一个被删除的构造函数,用来阻止从临时std::string直接构造string_view:
// 禁止从临时string构造string_view std::string_view(std::string const&&) = delete;
这个修改能让以下危险代码编译失败(临时字符串销毁后string_view会悬垂):
// 此操作现在会编译失败 std::string_view sv = std::string{"A"} + std::string{"B"};
但下面的强制转换代码仍能通过编译,同样会导致string_view悬垂——因为强制转换得到的const std::string&并不会延长临时拼接结果的生命周期:
// 存在风险的代码仍能编译 std::string_view sv = static_cast<const std::string&>(std::string{"A"} + std::string{"B"});
我们需要修改std::string,禁止其右值对象(比如拼接结果)转换为const std::string&,彻底消除这个漏洞。
解决方案
给std::string添加一个右值限定的、被删除的const std::string&转换运算符:
namespace std { class string { // ... 原有成员保持不变 ... // 禁止右值string转换为const引用 operator const string&() && = delete; }; }
原理说明
- 当尝试将右值
std::string(比如拼接产生的临时对象)转换为const std::string&时,编译器会匹配到这个被删除的右值版本转换函数,直接触发编译错误,阻止危险操作。 - 左值
std::string转换为const std::string&的常规场景不受影响:左值会匹配默认的隐式转换,不会触发这个被删除的函数,完全兼容正常代码逻辑。
通过这个修改,所有试图绕开string_view右值构造限制的强制转换操作都会被编译器拦截,从根源避免了string_view悬垂的风险。
内容的提问来源于stack exchange,提问作者Terens Tare
相关产品推荐
相关产品推荐

