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
相关产品推荐
相关产品推荐

