将 int 附加到 std::string

2024-03-25

我尝试了两种不同的方法来附加int to a std::string,令我惊讶的是,我得到了不同的结果:

#include <string>

int main()
{
    std::string s;
    s += 2;     // compiles correctly
    s = s + 2;  // compiler error

    return 0;
}

为什么当我使用时它可以正确编译并工作+=运算符,但当我使用时失败+操作员?

我不认为这个问题是这样的如何连接 std::string 和 int? https://stackoverflow.com/questions/191757/how-to-concatenate-a-stdstring-and-an-int

在那个问题中,没有答案使用+=运算符。和之间的区别+= and +的运算符std::string是解决我疑惑的关键。

坦率地说,这个问题是解释为什么 C++ 如此难以掌握的一个很好的例子。


TL;DR operator+=是一个类成员函数class string, while operator+是一个模板函数。

标准班template<typename CharT> basic_string<CharT>具有重载功能basic_string& operator+=(CharT),字符串只是basic_string<char>.

由于适合较低类型的值可以自动转换为该类型,因此在表达式中s += 2, 2 是not像...一样对待int, but char反而。它有exactly效果与s += '\x02'。附加一个带有 ASCII 代码 2 (STX) 的字符,not字符“2”(ASCII 值为 50 或 0x32)。

但是,字符串没有像这样的重载成员函数string operator+(int), s + 2不是有效的表达式,因此会在编译期间引发错误。 (更多内容见下文)

您可以通过以下方式在字符串中使用运算符+函数:

s = s + char(2); // or (char)2
s = s + std::string(2);
s = s + std::to_string(2); // C++11 and above only

对于那些担心为什么 2 不会自动转换为的人char with operator+,

template <typename CharT>
  basic_string<CharT>
  operator+(const basic_string<CharT>& lhs, CharT rhs);

The above is the prototype[note] for the plus operator in s + 2, and because it's a template function, it is requiring an implementation of both operator+<char> and operator+<int>, which is conflicting. For details, see Why isn't automatic downcasting applied to template functions? https://stackoverflow.com/questions/45506372

同时,原型operator+= is:

template <typename CharT>
class basic_string{
    basic_string&
      operator+=(CharT _c);
};

你看,这里没有模板(它是一个类成员函数),所以编译器推断出 CharT 类型是char来自类实现,以及int(2)会自动转换为char(2).


Note: Unnecessary code is stripped when copying from C++ standard include source. That includes typename 2 and 3 (Traits and Allocator) for template class "basic_string", and unnecessary underscores, in order to improve readability.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 int 附加到 std::string 的相关文章

随机推荐

  • Android动态功能模块依赖关系

    所以我有几个共享通用代码的功能 让我们称它们为 feature1 和 feature2 我无法将共享代码添加为 feature1 和 feature2 的依赖项 Android studio 抛出以下错误 多个 APK 打包同一库可能会导致
  • 找不到引用 Microsoft.DirectX.AudioVideoPlayback 和 Microsoft.DirectX

    我已经安装了 net 4 0 以及 XNA 4 0 前段时间我用过Microsoft DirectX播放一些音乐 现在当我尝试重做工作时 我找不到参考 平台上的新变化是否修改或移动了参考文献中的某些内容 视觉工作室 2010 右键单击项目
  • 如何使用preparedstatement获取最后插入行的id? [复制]

    这个问题在这里已经有答案了 我使用以下代码将新行插入数据库 我需要获取最后插入行的 id 但是当我运行代码时 它显示以下消息 SEVERE java sql SQLException Generated keys not requested
  • 加载后隐藏微调器

    我想在加载页面后隐藏微调器 我尝试过这个 document ready function loader hide Hide it initially ajaxStart function this show ajaxStop functio
  • 如何将 IsActiveAsync 失败信息传递给用户和客户端?

    In my IdentityServer4我实施的项目IProfileService The IsActiveAsync使用隐式和混合流时 在人类用户通过登录网页成功进行身份验证后 会多次调用该方法 我注意到它被调用时context Cal
  • 结构归纳终止

    我无法让 Agda 的终止检查器接受使用结构归纳定义的函数 我认为 我创建了以下最简单的示例来展示此问题 以下定义size被拒绝 即使它总是在严格较小的组件上递归 module Tree where open import Data Nat
  • DB 或 XML 问题

    XML 似乎是另一种以更小规模存储信息的方式 而DB可以处理所有类型 我有兴趣了解每种方法的优点和缺点 在某个场景中 其中一个更好吗 我确信每个人都有最好的情况 先感谢您 嗯 XML 是任何人都可以读取的文件 因为它是文本 数据库必须通过
  • MFC 控件上的文本 - Unicode 字符(例如日语)被截断

    背景 我正在开发一个 C MFC 应用程序 我们已经将其转换为显示 unicode 字符以支持外语 在大多数情况下 这是成功的并且 unicode 字符显示正确 但我遇到了一个问题 某些控件上的某些文本被截断 Example 在这里 您可以
  • 使用linqpad作为主要查询工具

    我团队的一名成员最近转而使用 LinqPad 作为他的主要查询工具 有时仍然会使用 SQL Studio 其简单目的是迫使自己使用 LINQ 变得更自然 我认为这是一个非常好的主意 并正在考虑要求我的团队的其他成员进行此转换 有人对采取这种
  • 以编程方式唤醒 OSX 上的显示

    我已经设法让显示器立即进入睡眠状态 pmset displaysleepnow 在终端中 但是为了唤醒显示屏 我只找到了 pmset schedule wake 12 24 2009 00 00 00 如果我尝试将任何事情安排得早于从现在起
  • 在我的 c++ 项目中,在 Windows 上使用 libcurl 和 Visual Studio 不起作用,因为字符串已损坏

    正如标题中所解释的 我尝试使用 libcurl C API 提交简单的 http 查询 我使用 Windows 作为操作系统 C 作为语言 Visual Studio 2008 作为 IDE 我的代码非常简单 我初始化卷曲 CURLcode
  • Linq To SQL 指定的强制转换对于 Union 无效错误

    我有以下代码 它在 NET 4 0 中针对 SQL Server 2008 R2 服务器使用 Linq to SQL public void Patients var documents GetEMRDocumentsByPatientId
  • 乐观锁绝对安全吗?

    当使用乐观锁定策略时 可以解决如下并发问题 the first transaction started select a row the second transaction started update the row with vers
  • 如何订阅在不同 JVM 上运行的反应式流实现?

    假设我们有两个 Akka Stream 流 每个流都在自己的 JVM 上运行 A reactive streams publisher running on JVM 1 val stringPublisher Publisher Strin
  • 使用 xslt 样式表将 xhtml 空行转换为 XSL-FO 空行

    我正在使用 XSLT 样式表 由 Antennahouse 提供 将 XHTML 转换为 XSL FO 文件 我在 XHTML 文件中将一个空行定义为 2 个连续的 HTML BR 标记 现在 XSL FO 格式不提供对空行的本机支持 我想
  • 如何将多行字符串转换为数组,其中每个元素都是所述字符串的一行? [复制]

    这个问题在这里已经有答案了 可以说我有 string str Line 1 Line 2 Line 3 我怎样才能把它变成一个数组 其中 3 个元素是 第 1 行 第 2 行 和 第 3 行 使用此选项 RemoveEmptyEntries
  • D365 FO 到期合同简单查询

    我需要创建简单的查询 该查询将显示将在未来 3 个月内到期的所有合同 我知道如何使用 SQL 执行此操作 但在创建查询时如何在 Visual Studio 中执行此操作 我添加了数据源合同表 添加了范围 过期日期所在的列是 VALIDTO
  • Spring Transaction - 代理混淆

  • SwiftUI - 如何在 macOS 上隐藏窗口标题

    在具有新 SwiftUI 框架的 macOS 上 无需AppDelegate SceneDelegate 如何隐藏窗口标题 我发现 Apple 的这篇文章描述了如何为 Catalyst 应用程序执行此操作 但现在没有该委托 我该如何实现此目
  • 将 int 附加到 std::string

    我尝试了两种不同的方法来附加int to a std string 令我惊讶的是 我得到了不同的结果 include