考虑一下:
std::string str = "Hello " + "world"; // bad!
rhs 和 lhs 都为operator +
are char*
s。没有定义operator +
这需要两个char*
s (事实上,该语言不允许您编写一个)。结果,在我的编译器上,这会产生“无法添加两个指针”错误(您的编译器显然是用数组来表达事物,但这是同样的问题)。
现在考虑一下:
std::string str = "Hello " + std::string("world"); // ok
There is的定义operator +
这需要一个const char*
作为 lhs 和 astd::string
作为rhs,所以现在大家都很高兴。
您可以将其扩展到您喜欢的任意长的串联链。但它可能会变得混乱。例如:
std::string str = "Hello " + "there " + std::string("world"); // no good!
这不起作用,因为你正在尝试+
two char*
lhs 转换为之前的 sstd::string
。但这很好:
std::string str = std::string("Hello ") + "there " + "world"; // ok
因为一旦你转变为std::string
, 你可以+
尽可能多的额外char*
如您所愿。
如果这仍然令人困惑,添加一些括号来突出显示关联性规则,然后用变量的类型替换变量名可能会有所帮助:
((std::string("Hello ") + "there ") + "world");
((string + char*) + char*)
第一步是调用string operator+(string, char*)
,这是在标准库中定义的。将这两个操作数替换为它们的结果给出:
((string) + char*)
这正是我们刚刚所做的,而且仍然合法。但尝试同样的事情:
((char* + char*) + string)
你被困住了,因为第一个操作试图添加两个char*
s.
这个故事的寓意:如果您想确保串联链能够正常工作,只需确保前两个参数之一的类型明确即可std::string
.