首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >连接std::string和int将导致转移。为什么?

连接std::string和int将导致转移。为什么?
EN

Stack Overflow用户
提问于 2020-05-06 09:39:00
回答 3查看 107关注 0票数 1

今天,当我试图将一个std::string和一个int连接起来时,我感到很惊讶。考虑以下MWE:

代码语言:javascript
运行
复制
#include <iostream>
#include <string>

void print(const std::string& text)
{
    std::cout << "The string is: " << text << ".\n";
}

int main()
{
    print("iteration_" + 1);

    return 0;
}

而不是印刷

代码语言:javascript
运行
复制
The string is: iteration_1.

我希望它能打印出来

代码语言:javascript
运行
复制
The string is: teration_.

背景到底是怎么回事?由于某种原因,字符串是否被转换为char[]或类似的东西?operator+文档没有列出任何带有std::stringint的列表。

用数字连接std::string的正确方法是什么?我真的要把它们都扔进std::stringstream,还是用std::to_string()把数字转换成std::string

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-06 09:41:42

由于某种原因,字符串是否转换为char[]?

事实上,情况正好相反。"iteration_"是一个char[11],当您添加1时,它会衰减为const char*。将指针递增一个使其指向字符串中的下一个字符。然后,这将用于构造一个临时std::string,其中包含除第一个字符之外的所有字符。

您所链接的文档用于operator+ of std::string,但要使用该文档,您首先需要一个std::string

票数 2
EN

Stack Overflow用户

发布于 2020-05-06 09:41:32

这一行是问题所在:

代码语言:javascript
运行
复制
print("iteration_" + 1);

字符串文本正在退化为char*。将1添加到此char*中,将其移动到下一个字符。

如果您想将字符串"1"添加到文本的末尾,一个非常简单的方法是将字符串文本传递给std::string构造函数,并手动将1转换为字符串。例如:

代码语言:javascript
运行
复制
print(std::string("iteration_") + std::to_string(1));
票数 2
EN

Stack Overflow用户

发布于 2020-05-06 09:43:26

如果您尝试使用以下内容:

代码语言:javascript
运行
复制
std::string str = "iteration" + 1;

编译器将抛出警告:

警告:将'int‘添加到字符串中并不会附加到字符串-Wstring-plus-int。

这是因为您正在将指向“迭代”字符串的指针递增1,这意味着现在"teration“字符串被分配给str变量。

连接的适当方式是:

代码语言:javascript
运行
复制
std::string str = "iteration" + std::to_string(1);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61631956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档