xem xét ví dụ tối thiểu sau đây:Trình tự giải quyết tình trạng quá tải toán tử liên quan đến temporaries
#include <iostream>
using namespace std;
class myostream : public ostream {
public:
myostream(ostream const &other) :
ostream(other.rdbuf())
{ }
};
int main() {
cout << "hello world" << endl;
myostream s(cout);
s << "hello world" << endl;
myostream(cout) << "hello world" << endl;
}
Kết quả, cả trên g ++ và Visual C++, là
hello world
hello world
0x4012a4
Các phiên bản đó ghi vào một đối tượng tạm thời , myostream(cout)
, dường như thích toán tử thành viên ostream::operator<<(void *)
, thay vì toán tử miễn phí operator<<(ostream &, char *)
. Dường như tạo sự khác biệt cho dù đối tượng có tên hay không.
Tại sao điều này lại xảy ra? Và làm cách nào để ngăn chặn hành vi này?
Chỉnh sửa: Tại sao điều này xảy ra hiện rõ ràng với nhiều câu trả lời khác nhau. Về cách ngăn chặn điều này, những điều sau đây có vẻ hấp dẫn:
class myostream : public ostream {
public:
// ...
myostream &operator<<(char const *str) {
std::operator<<(*this, str);
return *this;
}
};
Tuy nhiên, điều này dẫn đến tất cả các loại không rõ ràng.
Bạn có thể cân nhắc câu trả lời này đến câu hỏi khác như là một điểm khởi đầu cho một cái gì đó ít nhất cũng tương tự như những gì bạn muốn đạt được: http://stackoverflow.com/questions/469696/what-is-your-most-useful-cc-snippet/470999#470999 Bạn sẽ phải thêm chức năng cho lớp học để chấp nhận các biến tố đầu vào (std :: hex, std :: endl ...), nhưng điều đó không quá khó. –