是什么使以'+'开头的字符串添加为有效语句?

问题描述 投票:1回答:2

我的代码中出现复制/粘贴错误,并以如下所示的一行结尾:myString = otherString; + "?" + anotherString;

第一个分号后的代码未发出任何错误或警告。使用online compiler仔细检查我的环境,我创建了这个快速示例,该示例也可以编译并运行:

int main()
{
    std::string sText("Hello World");
    std::string sMore(" again");

    + "???" + sText + sMore; //No warning, no error

    cout << sText; //output "Hello World" as expected

    + 4; //Warning has no effect
    + sMore; //error: no match for ‘operator+’ (operand type is ‘std::string {aka std::basic_string}’)


    return 0;
}

那么开始+在做什么?

c++ string syntax operator-overloading
2个回答
4
投票

文字字符串(例如"???")实际上是字符数组。像所有其他数组一样,它们衰减到指向自己的指针。这就是这里发生的情况,表达式+ "???"将一元+运算符应用于指向字符串第一个元素的指针。

这将导致另一个指向字符的指针(指向一个字符),然后可以将其用于添加到std::string对象。

对于其他文字,例如数字,也会发生同样的事情,这就是+4也有效的原因。

但是没有为+定义一元std::string运算符,这就是为什么会出现+sMore错误的原因。


2
投票

首先,字符串文字是字符数组。当您将数组作为操作数传递给一元运算符+时,该数组将隐式转换为指向第一个元素(类型为const char)的指针。这种隐式转换称为衰减。

© www.soinside.com 2019 - 2024. All rights reserved.