在我的文件顶部,我有
#define AGE "42"
稍后在文件中我多次使用 ID 包括一些看起来像的行
std::string name = "Obama";
std::string str = "Hello " + name + " you are " + AGE + " years old!";
str += "Do you feel " + AGE + " years old?";
我得到错误:
“错误:’const char [35]’ 和 ‘const char [2]’ 类型的无效操作数到二进制 ‘operator+‘”
在第 3 行。我做了一些研究,发现这是因为 C++ 如何处理不同的字符串,并且能够通过将“AGE”更改为“string(AGE)”来修复它。但是,直到今天,我不小心错过了其中一个实例,并且想知道为什么编译器没有抱怨,即使我仍然有一个只是“AGE”的实例。
通过一些试验和错误,我发现我只需要 string(AGE)
在我不连接在函数体中创建的另一个字符串的行上。
我的问题是“在后台发生了什么,C++ 不喜欢将字符串与预处理器放置的字符串连接起来,除非你也在连接你在函数中定义的字符串。”
原文由 janovak 发布,翻译遵循 CC BY-SA 4.0 许可协议
考虑一下:
operator +
的右轴和左轴都是char*
s。没有定义operator +
需要两个char*
(事实上,语言不允许你写一个)。结果,在我的编译器上,这会产生“无法添加两个指针”错误(您的显然是用数组来表达事物,但这是同样的问题)。现在考虑一下:
有 一个
operator +
的定义,它将const char*
作为 lhs,将std::string
作为 rhs,所以现在每个人都很高兴。您可以将其扩展到任意长度的串联链。不过,它可能会变得混乱。例如:
这不起作用,因为您在将 lhs 转换为
std::string
之前尝试+
两个char*
s。但这很好:因为一旦您转换为
std::string
,您就可以+
任意数量的char*
。如果这仍然令人困惑,它可能有助于添加一些括号以突出显示关联性规则,然后将变量名称替换为它们的类型:
第一步是调用标准库中定义的
string operator+(string, char*)
。用它们的结果替换这两个操作数给出:这正是我们刚刚所做的,并且仍然是合法的。但是尝试同样的事情:
你被卡住了,因为第一个操作试图添加两个
char*
s。故事的寓意:如果您想确保连接链能够正常工作,只需确保前两个参数之一是明确的类型
std::string
。