【问题标题】:Adding strings and literals (C++)添加字符串和文字 (C++)
【发布时间】:2019-11-18 11:53:26
【问题描述】:

在 C++ Primer 一书中,我遇到了这样的语句:“当我们混合字符串和字符串或字符文字时,每个 + 运算符的至少一个操作数必须是字符串类型”

我注意到以下内容无效:

#include<string>
int main()
{
    using std::string;
    string welcome = "hello " + "world";    //example 1
    string short_welcome = 'h' + 'w';      //example 2

    return 0;
}
  • 问题 1:为什么示例 1 会产生错误,因为两个操作数 是字符串文字吗?
  • 问题2:为什么至少有一个操作数必须是字符串?
  • 问题 3:为什么示例 2 也 产生错误?

我只是想了解幕后发生的事情。

【问题讨论】:

  • @vlad 好的,我明白了。删除讨论

标签: c++ string operator-overloading user-defined-types


【解决方案1】:

您只能重载用户定义类型的运算符,例如类std::string

所以这些运算符用于基本类型

"hello " + "world"

'h' + 'w'

不能重载。

在第一个表达式中,字符串文字被转换为指向它们的第一个元素的指针。但是二元运算符 + 没有为指针定义。

在第二个表达式中,字符文字被转换为整数,结果是一个整数。但是 std::string 类没有接受整数的隐式构造函数。

你可以写例如

string welcome = std::string( "hello " ) + "world"; 

string welcome = "hello " + std::string( "world" ); 

string short_welcome( 1, 'h' );
short_welcome += 'w';

【讨论】:

  • auto welcome = "hello "s + "world";(在using namespace std::string_literals;之后)
【解决方案2】:

在第一种情况下,"hello""world" 不是 std::strings!你写它们的方式,它们是char-arrays。

解决这个问题的方法是将它们显式定义为字符串文字:

string welcome = "hello "s + "world"s;    //example 1

这是std::string 的一部分,定义为operator""。但是需要添加using namespace std::string_literals;才能使用。

其余的在其他答案中解释。

【讨论】:

    【解决方案3】:

    文字字符串实际上是常量字符数组。因此,它们衰减为指向它们的第一个元素的指针。添加两个字符串文字就是添加这些指针。结果是指向某个完全不相关的位置的指针。

    对于字符,它们首先得到promoted to int,然后将它们作为整数相加,结果是int


    对于第一个示例,当您执行"hello " + "world" 时,它实际上等同于&amp;(("hello ")["world"])。这没有任何意义,添加文字字符串也没有任何意义。

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      相关资源
      最近更新 更多