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

C++17中字符串相加结果的引用合法性及直接相加问题咨询

C++17中字符串相加与引用合法性的问题解答

先看你给出的C++17合法代码:

#include <string>
using namespace std;

string s = "asd";
string &ss = "asd" + s;  // 此处

针对你的两个疑问,解答如下:

疑问1:为什么引用ss合法?它引用的是什么?

ss引用的是"asd" + s运算产生的std::string临时对象。
在C17之前,非const左值引用确实不能直接绑定到临时对象——当时只有const左值引用或右值引用能绑定临时对象并延长其生命周期。但C17引入了临时量实质化的规则:当用纯右值(比如operator+返回的临时对象)初始化同类型的左值引用时,临时对象会被转化为一个具名的临时实体,并且它的生命周期会被延长到引用ss的生命周期结束,因此这段代码在C++17中变得合法。

疑问2:为什么"asd"可以直接与s相加?之前不是需要写成string("asd") + s吗?

其实在C++17之前,"asd" + s本身就是合法的,你可能混淆了另一种场景。
字符串字面量"asd"的类型是const char[4],在表达式中会退化为const char*。标准库为std::string提供了对应的operator+重载:允许const char*作为左操作数,与std::string类型的右操作数相加,返回一个新的std::string临时对象。
而你误以为需要转成std::string的场景,应该是两个字符串字面量直接相加(比如"asd" + "qwe"),这种情况是非法的——因为两个const char*不能直接用+运算,此时才需要把其中一个转为std::string,比如std::string("asd") + "qwe"。

内容的提问来源于stack exchange,提问作者f1msch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:16:23