为什么 std:string + 没有int 给出编译错误?
我们刚刚发现我们的同事认为他可以向 std::string 添加一个整数,并在他的代码中到处使用了这样的操作。
我们没有看到此操作有任何编译器错误,我不明白为什么:没有 operator+ (const string& lhs, int rhs);
。 int 会默默地转换为 char 吗? (使用 gcc Red Hat 4.1.2 和 -Wall 开关进行编译)。
而且,最重要的是,我们如何找到所有将 int 添加到 std::string 的行?
We just found our colleague thought he can add an integer to std::string and used such operation here and there in his code.
We don't see any compiler error for this operation and I don't understand why: there is no operator+ (const string& lhs, int rhs);
. Is int silently casted to char? (Compiling with gcc Red Hat 4.1.2 and -Wall switch).
And, most important, how do we find all the lines where int added to std::string?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
当您的同事仅使用整数文字时,它们将被转换为
char
- 但是,如果整数值太大,您将看到警告。被调用的运算符是或者
+=
变体 ;)关于如何查找所有调用。您可以编译(不内联)所有代码,
objdump
它,grep
来查找所有出现的运算符,并在过滤后的地址上使用addr2line
:然而,这并没有给我行号...至少调用站点在那里;)
-C
开关启用 c++ 名称分解。也可以使用 binutlsc++filt
。
有趣的是,有
string
和char
的operator+
定义,但仅限于使用operator+ 时=
整数文字转换为char
,我必须传递char
文字(或值)才能使用operator+
。查找操作员的损坏名称:
最后一个是您正在搜索的名称 - 可用于 grep 不进行名称损坏。
我真的不知道更好的方法来做到这一点......:/
When your colleague only used integer literals, these will be converted to
char
- You will however see a warning if the value of the integer is too big. The operator that gets called isOr the
+=
variant ;)On how to find all the calls. You could compile (w/o inlining) all the code,
objdump
it,grep
for all the operator occurrences and useaddr2line
on the filtered addresses:This however hasn't given me the line number... At least the call site is there ;)
The
-C
switch enables c++ name demangling. Which can also be done manually with binutlsc++filt
.Funnily enough, there is a definition of
operator+
forstring
andchar
, but only when usingoperator+=
the integer literal is converted tochar
, I have to pass achar
literal (or value) foroperator+
to be used.To find the mangled name of your operator:
The last one is the name you are searching for - which can be used to grep w/o name demangling.
I really don't know a better way to do this... :/