You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:12:43