Я встретив ошибку компиляции для следующего кода:определяемые пользователем функции преобразования и литья для ссылки
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;
}
Без «сопзЬ» и «&» в определенной пользователем преобразования строки типа, она делает не компилируется в г ++ (4.8) с --std = C++ 11 флага:
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_;}
код компилируется на Clang в обоих направлениях. Какой компилятор прав? Должен ли этот код компилироваться с operator std::string()
?
Я получаю [компиляционную ошибку] (http://cpp.sh/6wbj) – CoryKramer
@CoryKramer Вы скомпилировали версию без 'const' и '&'? – ENIGMA
Just FYI - если вы задаете вопросы о компиляции кода, лучше написать пример как код, который не компилируется, чтобы люди могли просто скопировать и вставить. – Barry