C++ 是什么使以“+”开头的字符串加法成为有效语句?

C++ 是什么使以“+”开头的字符串加法成为有效语句?,c++,string,syntax,operator-overloading,C++,String,Syntax,Operator Overloading,我的代码中有一个复制/粘贴错误,最后出现了一行,如下所示: myString=otherString;+?+另一串 第一个分号后的代码没有发出任何错误或警告。我使用一个用于双重检查我的环境的示例创建了这个快速示例,该示例还编译并运行: int main { 字符串sTextHello-World; std::字符串再次出现; +??+sText+sMore;//无警告,无错误 cout像?这样的文字字符串实际上是字符数组。与所有其他数组一样,它们衰减为指向自身的指针。这就是这里发生的情况,表达式

我的代码中有一个复制/粘贴错误,最后出现了一行,如下所示: myString=otherString;+?+另一串

第一个分号后的代码没有发出任何错误或警告。我使用一个用于双重检查我的环境的示例创建了这个快速示例,该示例还编译并运行:

int main { 字符串sTextHello-World; std::字符串再次出现; +??+sText+sMore;//无警告,无错误 cout像?这样的文字字符串实际上是字符数组。与所有其他数组一样,它们衰减为指向自身的指针。这就是这里发生的情况,表达式+???在指向字符串第一个元素的指针上应用一元+运算符

这将导致另一个指向与第一个字符相等的字符的指针,该指针可用于添加到std::string对象

其他文字(如数字)也会发生同样的情况,这就是+4也有效的原因

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

像?这样的文字字符串实际上是字符数组。与所有其他数组一样,它们会衰减为指向自身的指针。这就是这里发生的情况,表达式+???在指向第一个元素的指针上应用一元+运算符线的长度

这将导致另一个指向与第一个字符相等的字符的指针,该指针可用于添加到std::string对象

其他文字(如数字)也会发生同样的情况,这就是+4也有效的原因


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

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

一元运算符+的结果是转换后的操作数,即本例中指向字符串文字的第一个元素的指针

下面的二进制运算符+调用重载运算符,该运算符将指向字符的指针作为一个操作数,将std::string对象作为另一个操作数

对于整数,运算符+的行为相同,除了数组到指针衰减之外,还有整数提升。int没有提升,但小于int的所有类型都是。对于std::string,一元数+没有重载,因此出现错误

我假设该行没有警告,因为调用运算符+会产生影响,即使值没有存储

无效只是警告是否丢弃操作结果的原因。在字符串情况下,结果用作二进制运算符的操作数,因此没有理由警告无效


现在,二进制运算的结果是分等级的,也没有效果,但编译器实际上不可能分析所有可能的代码路径的效果,而且它也不会尝试这样做。编译器很乐意检查指针上的原始操作,但它可能不会费心分析函数调用运算符类的重载是函数。

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

一元运算符+的结果是转换后的操作数,即本例中指向字符串文字的第一个元素的指针

下面的二进制运算符+调用重载运算符,该运算符将指向字符的指针作为一个操作数,将std::string对象作为另一个操作数

对于整数,运算符+的行为相同,除了数组到指针衰减之外,还有整数提升。int没有提升,但小于int的所有类型都是。对于std::string,一元数+没有重载,因此出现错误

我假设该行没有警告,因为调用运算符+会产生影响,即使值没有存储

无效只是警告是否丢弃操作结果的原因。在字符串情况下,结果用作二进制运算符的操作数,因此没有理由警告无效


现在,二进制运算的结果是分等级的,也没有效果,但编译器实际上不可能分析所有可能的代码路径的效果,而且它也不会尝试这样做。编译器很乐意检查指针上的原始操作,但它可能不会费心分析函数调用运算符或者类的重载是函数。

好的,很好。“一元+”是我忘记的东西。我知道字符串文字与std::string不一样。我假设我
在该行中没有警告,因为调用运算符+会产生影响,即使该值未存储。在一元+运算符上。好的,太好了。”一元+是我忘记的。我知道字符串文字与std::string不同。我假设该行没有警告,因为调用运算符+会产生影响,即使值没有存储。关于一元+运算符。