Tôi đang gặp phải một lỗi biên dịch cho đoạn mã sau:người dùng định nghĩa chức năng chuyển đổi và đúc để tham khảo
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;
}
Nếu không có sự 'const' và '&' trong dòng chuyển đổi kiểu người dùng định nghĩa, nó không không biên dịch trong g ++ (4.8) với --std = C++ 11 cờ:
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_;}
Mã biên dịch theo cả hai cách. Trình biên dịch nào là chính xác? Mã này có biên dịch với operator std::string()
không?
Tôi nhận được [không lỗi biên dịch] (http://cpp.sh/6wbj) – CoryKramer
@CoryKramer Bạn đã biên dịch bằng phiên bản không có 'const' và '&'? – ENIGMA
Chỉ cần thông tin - nếu bạn đang đặt câu hỏi về mã không biên dịch, tốt hơn bạn nên viết ví dụ dưới dạng mã không biên dịch sao cho mọi người có thể nhanh chóng sao chép và dán. – Barry