字符串拼接

16

为什么能够这样做

const string exclam = "!";
const string str = exclam + "Hello" + " world";

无法做到这一点:

const string exclam = "!";
const string str = "Hello" + " world" + exclam;

我知道(尽管不明白原因),不允许这样做:

const string str = "Hello" + " world" + "!";

因为它将被解释为const char[6] + const char[6] + const char[1],所以从另一方面来看,为什么这也不被允许或者为什么它使用char[]而不是string


4
如果你想拼接字符串字面值,那么不要使用 +const string str = "Hello" " world" + exclam; - UncleBens
还可以查看 https://onlinegdb.com/rJxM4IugX - g19fanatic
5个回答

19
+操作符是左结合的(从左到右计算),因此最左边的+首先被计算。 exclam是一个重载了operator+std::string对象,所以下面两个表达式都可以进行字符串连接:
exclam + "Hello"
"Hello" + exclam

这两种方法都会返回一个包含串联字符串的 std::string 对象。

但是,如果前两个被“添加”的元素是字符串字面值,例如:

"Hello" + "World"

这里没有涉及到任何类类型对象(也没有std::string)。字符串字面值被转换为指针,且指针没有内置operator+


1
@sbi:运算符永远不会被计算,操作数才会。 - Prasoon Saurav
@Prasoon:一个有效的挑剔,但我无能为力,因为我不能再编辑那个评论了。(不过,你没有回答我的暗示问题。) - sbi
@sbi: 这些运算符在英语中也被称为“左结合”。当我最初发布时,我记不清“X结合”是否意味着“X最”的运算符首先还是最后被评估(其中“X”为“left”或“right”)。谢谢。@Prasoon:从技术上讲,是_表达式_被评估:-) - James McNellis
谢谢,现在我确定了!附言:我移除了我的评论,因为你已经将其合并到你的答案中了。 - sbi

3
这是因为你正在连接const char[6]+const char[6],正如你所说,这是不允许的。
在C ++中,字符串字面值(双引号之间的内容)被解释为const char[]
你可以将stringconst char[](反之亦然)连接起来,因为+运算符在字符串中被重载了,但对于基本类型来说它无法被重载。

1
@Philip:字符串字面值的类型为const char[N],其中N是字符串字面值的大小。它是一个数组,并且像数组一样,可以隐式转换为指向其第一个元素(const char*)的指针。在C++中,虽然将字符串字面值转换为(非constchar*的转换已被弃用,但仍然允许。 - James McNellis

3
const string exclam = "!";    // Initialize a c++ string with an ansi c string
const string str = exclam + "Hello" + " world"; // Using the operator+ method of exclam

你可以这样做,因为exclam的operator+将返回一个包含“!Hello”的新字符串,然后您可以将其作为参数调用另一个operator+,加上“ world”,这样您就会得到另一个字符串,最终通过复制构造函数赋给str。
另一方面,
const string str = "Hello" + " world" + exclam;

无法执行此操作,因为 "Hello" 只是一个 const char *,它没有使用 const char * 作为参数的 operator+


1

(新回答,这在2010年还不可能)

现在你可以编写:

const string str = "Hello"s + " world"s + "!"s;
//                        ^           ^      ^

通过在字符串字面量后添加s,您告诉编译器它实际上是一个std::string而不是const char[]。这意味着您可以在其上调用成员函数。例如:("ABC"s).back(),还可以使用+

仅适用于C++14:https://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s - g19fanatic

0
除了已经解释了你观察到的原因的答案之外,我在这里发布如何摆脱这个问题的方法(你可能已经想出来了)。
替换
const string str = "Hello" + " world" + exclam;

使用

const string str = string("Hello") + " world" + exclam;

所以你要确保第一个操作数是一个字符串而不是一个const char[]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接