Nehmen einfachen Code:abi_tab auf Operator std :: string(): Inkompatibilitäten in Klirren ++ und 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();}
als die bei Symbolnamen lassen aussehen:
g++ -std=c++11 -c sample.cpp
nm -C sample.o
Wir werden solche Symbole sehen:
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
Funktion 'foo' ist markiert - Es ist vollkommen richtig. In seinem Namen gibt es kein Zeichen von ABI, aber es verwendet std :: string, das von ABI abhängig ist.
Funktion 'bar' ist nicht markiert. Und es ist auch OK, da seine Unterschrift direkten Bezug auf ABI über den Namespace std :: __ cxx11 hat.
Aber 'operator std :: string' ist auch markiert. Warum? Es hat bereits 'std :: __ cxx11' in seinem Namen.
Und 'std :: string :: empty' ist nicht markiert. - Logisch für mich.
Wenn wir dieselben Schritte mit Klirren ++ (3.9, Stamm aus dem SVN) wiederholen werden wir etwas anderes Bild sehen:
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
Alles ist gleich, aber ‚Betreiber std :: string‘.
Wer ist hier richtig g ++ oder clang ++? Ich denke, das Klängen ist logischer.
Allerdings haben wir bereits einige Bibliotheken mit g ++ in verschiedenen Linux-Distributionen kompiliert. Es ist also wahrscheinlich, dass der Klang verändert wird.
Ich habe diesen Fehler in llvm eingereicht. Aber immer noch Zweifel - es ist clang oder gcc bug?
Frage nur aus Neugier, warum ist es dir wichtig? – Arunmu
Das ist wichtig für mich, da ich mein Projekt mit clang nicht kompilieren kann, nur gcc. –