c 11 – 运算符std :: string()上的abi_tab:clang和g中的不兼容性

拿简单的代码:

#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是规范参考.

点赞