での非互換性は、簡単なコードを取る:abi_tab ::文字列():打ち鳴らす++と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の直接参照を持つこともOKです。
しかし、 '演算子std :: string'にもタグが付けられています。どうして?その名前にはすでに 'std :: __ cxx11'があります。
'std :: string :: empty'にはタグが付けられていません。 - 私のための論理。
私たちが打ち鳴らすと同じ手順を繰り返した場合++(3.9、SVNからトランク)我々は少し別の画像が表示されます。
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
すべてが同じですが、「オペレータのstd ::文字列」です。
g ++またはclang ++は誰ですか?私はclangの行動がより論理的だと思う。
しかし、すでにLinuxのさまざまなディストリビューションにg ++でコンパイルされたライブラリがあります。だから変わってしまうのはおそらくそれです。
私はllvmでこのバグを提出しました。しかし、疑問はまだあります。それはclangまたはgccバグですか?
好奇心から尋ねると、どうしてあなたにとって重要なのでしょうか? – Arunmu
私はclangで自分のプロジェクトをコンパイルできないので、私にとって重要です。gccだけです。 –