拿简单的代码:
#include <string>
class C{
public:
operator std::string ()const;
};
C c;
std::string foo(){return c;}
bool bar(std::string const&s){return s.empty();}
比让我们看一下符号名称:
g++ -std=c++11 -c sample.cpp
nm -C sample.o
我们会看到这样的符号:
bar(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
foo[abi:cxx11]()
C::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >[abi:cxx11]() const
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::empty() const
函数’foo’被标记 – 这是完全正确的.在它的名字中没有ABI的迹象,但它使用依赖于ABI的std :: string.
功能’bar’未标记.它也可以,因为它的签名通过std :: __ cxx11命名空间直接引用ABI.
但是’operator std :: string’也被标记了.为什么?它的名字已经是’std :: __ cxx11’了.
‘std :: string :: empty’未标记. – 对我来说很逻辑.
如果我们用clang(3.9,svn的trunk)重复相同的步骤,我们会看到一些不同的图片:
bar(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
foo[abi:cxx11]()
C::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >() const
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::empty() const
一切都是一样的但是’operator std :: string’.
谁在这里g或clang?我认为铿锵行为更合乎逻辑.
但是我们已经在各种Linux发行版中使用g编译了一些库.所以可能是要改变的铿锵声.
我在llvm中提交了这个bug.但仍然有疑虑 – 它是clang还是gcc bug?
最佳答案 ABI标记是一种GCC功能,只有在必要时才能模仿,GCC是规范参考.