为什么std:string + int没有编译错误?

时间:2010-12-23 08:27:10

标签: gcc stl g++ stdstring name-mangling

我们刚刚发现我们的同事认为他可以在std :: string中添加一个整数,并在他的代码中使用此类操作。

我们没有看到此操作的任何编译器错误,我不明白为什么:没有operator+ (const string& lhs, int rhs);。 int是否默默地转换为char? (使用gcc Red Hat 4.1.2和-Wall开关编译)。

而且,最重要的是,我们如何找到int添加到std :: string的所有行?

1 个答案:

答案 0 :(得分:3)

当你的同事只使用整数文字时,它们会转换为char - 但是如果整数的值太大,你会看到一个警告。被调用的运算符是

std::string operator+(const std::string &s, char c); // actually it's basic_string<> with some CharT...

+=变种;)

关于如何查找所有电话。您可以编译(无内联)所有运算符出现的所有代码objdumpgrep,并对过滤后的地址使用addr2line

$ cat string-plus.cpp
#include <string>
int main()
{
 std::string a = "moof ";
 a += 192371;
}
$ g++ -g string-plus.cpp
string-plus.cpp: In function ‘int main()’:
string-plus.cpp:5: warning: overflow in implicit constant conversion
$ objdump -Cd a.out | \
    grep 'call.*std::string::operator+=(char)@plt' | \
    tr -d ' ' | \
    cut -d: -f1 | \
    xargs addr2line -Cfe string-plus
main
??:0

然而,这没有给我行号...至少呼叫站点在那里;)

-C开关启用c ++名称demangling。也可以使用binutls c++filt手动完成。


有趣的是, operator+string的{​​{1}}定义,但只有在使用char时才会转换整数文字到operator+=,我必须为char传递char字面值(或值)才能使用。


查找运营商的受损名称

operator+

最后一个是您要搜索的名称 - 可用于grep w / o名称demangling。

我真的不知道更好的方法......:/