添加字符串和文字(C++)
Adding strings and literals (C++)
在《C++初级读本》一书中,我看到这样一句话:"当我们混合字符串和字符串或字符文字时,每个+运算符至少有一个操作数必须是字符串类型">
我注意到以下内容无效:
#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也生成错误
我只想了解幕后发生了什么。
在第一种情况下,"hello"
和"world"
是而不是std::string!按照您编写它们的方式,它们是char
数组。
克服这一问题的一种方法是将它们明确定义为字符串文字:
string welcome = "hello "s + "world"s; //example 1
这是std::string
的一部分,定义为operator""
。但是你需要添加using namespace std::string_literals;
才能使用它
其余部分将在其他答案中解释。
只能重载用户定义类型的运算符,例如类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';
文字字符串实际上是常量字符的数组。因此,它们衰减为指向其第一个元素的指针。添加两个字符串文字就是添加这些指针。结果是指向某个完全不相关的位置的指针。
对于字符,它们首先被提升为int
,然后作为整数相加,结果是int
。
对于第一个示例,当您执行"hello " + "world"
时,实际上相当于&(("hello ")["world"])
。这没有任何意义,添加文字字符串也没有任何意义。
相关文章:
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 如何使用字符串文字作为宏参数
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 构造<int>具有 2 个字符串文字的向量
- 将数字打印成文字
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 方便地对C++中的所有字符串文字进行模糊处理
- C++17 十六进制浮点文字单精度后缀冲突?
- 常量函数,当其参数是对文字类型的引用时
- 连接 LPCSTR 变量和文字?
- 比较 std::string 和 C 样式字符串文字
- 如何从char16_t字符串文字中读取双精度?
- 指内置类型的文字
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 为什么带有指针子对象的文字类类型的 constexpr 表达式不能是非类型模板参数
- 为什么文字不是常量(字符串除外)?
- 模板接受常量,但不接受文字
- 如果我在块中编写字符串文字,是否会从数据部分复制整个字符串数据?