jestem napotyka błąd kompilacji za pomocą następującego kodu:zdefiniowany przez użytkownika funkcja konwersji i oddające odwołać
class SymbolGroup
{
std::string d_;
public:
SymbolGroup(std::string a):d_(a){}
// explicit operator const std::string&() const { return d_;} // compiles
explicit operator std::string() const { return d_;} // Does not compile
};
inline
bool operator==(const SymbolGroup& lhs, const SymbolGroup& rhs)
{
return static_cast<const std::string&>(lhs) ==
static_cast<const std::string&>(rhs);
}
int main(){
SymbolGroup a("hello");
SymbolGroup b("hello");
if (a==b)
std::cout << "they are the same\n";
return 0;
}
Bez „const” i „&” w wierszu konwersji zdefiniowanej przez użytkownika typ, robi nie wkompilowania g ++ (4.8) z --std = C++ 11 flag
error: invalid initialization of reference of type ‘std::string& {aka std::basic_string&}’ from expression of type ‘const string {aka const std::basic_string}’ explicit operator std::string&() const { return d_;}
Kod zestawia na Clang obie strony. Który kompilator jest poprawny? Czy ten kod powinien się kompilować z operator std::string()
?
otrzymuję [no Błąd kompilacji] (http://cpp.sh/6wbj) – CoryKramer
@CoryKramer Czy kompilacji przy użyciu wersji bez 'const' i '&'? – ENIGMA
Wystarczy FYI - jeśli masz pytania o kod nie kompilacji, to lepiej napisać przykład jako kod, który nie kompiluje tak, że ludzie mogą po prostu szybko skopiować i wkleić. – Barry