连接两个字符串文字

新手上路,请多包涵

我正在阅读 Koenig 的 Accelerated C++。他写道:“新的想法是我们可以使用 + 来连接一个字符串和一个字符串文字 - 或者,就此而言,两个字符串(但不是两个字符串文字)。

好吧,我想这是有道理的。现在到两个单独的练习来说明这一点。

以下定义是否有效?

 const string hello = "Hello";

const string message = hello + ",world" + "!";

现在,我尝试执行上述操作并且成功了!所以我很高兴。

然后我试着做下一个练习;

 const string exclam = "!";

const string message = "Hello" + ",world" + exclam;

这没有用。现在我明白这与你不能连接两个字符串文字的事实有关,但我不明白为什么我设法让第一个例子工作之间的语义差异(不是“,世界”和“! “ 两个字符串文字?这不应该不起作用吗?)但不是第二个。

原文由 Arthur Collé 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 759
2 个回答
const string message = "Hello" + ",world" + exclam;

+ 运算符具有从左到右的关联性,因此等效的括号表达式为:

 const string message = (("Hello" + ",world") + exclam);

如您所见,首先“添加”了两个字符串文字 "Hello"",world" ,因此出现错误。

连接的前两个字符串之一必须是 std::string 对象:

 const string message = string("Hello") + ",world" + exclam;

或者,您可以强制第二个 + 通过括号表达式的该部分首先进行评估:

 const string message = "Hello" + (",world" + exclam);

It makes sense that your first example ( hello + ",world" + "!" ) works because the std::string ( hello ) is one of the arguments to the + . That + is evaluated, the result is a std::string object with the concatenated string, and that resulting std::string is then concatenated with the "!" .


至于 为什么 不能使用 + 连接两个字符串文字,这是因为字符串文字只是一个字符数组(a const char [N] 其中 N 是字符串的长度加一,用于空终止符)。在大多数情况下使用数组时,它会转换为指向其初始元素的指针。

因此,当您尝试执行 "Hello" + ",world" 时,您真正想做的是将两个 const char* 加在一起,这是不可能的(添加两个指针意味着什么在一起?),如果它是它不会做你想让它做的事情。


请注意,您 可以 通过将它们彼此相邻来连接字符串文字;例如,以下两个是等价的:

 "Hello" ",world"
"Hello,world"

如果您想将一个长字符串文字分成多行,这将很有用。但是,它们必须是字符串文字:这不适用于 const char* 指针或 const char[N] 数组。

原文由 James McNellis 发布,翻译遵循 CC BY-SA 3.0 许可协议

从 C++14 开始,您可以使用两个真正的 字符串文字

 const string hello = "Hello"s;

const string message = hello + ",world"s + "!"s;

或者

const string exclam = "!"s;

const string message = "Hello"s + ",world"s + exclam;

原文由 Thomas Sablik 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题