Đoạn mã sau đây là phiên bản đơn giản của nhật ký mà tôi sử dụng. Nó mở rộng std::ostringstream
và có thể được điền bằng cách sử dụng <<
-operator. Sau khi hủy tất cả nội dung được ghi vào std::cout
.Tại sao ghi vào đối tượng luồng chuỗi tạm thời chỉ in các địa chỉ đối tượng?
Viết (<<
) trực tiếp vào một đối tượng tạm thời, Logger()
, tôi mong chờ nó để in mà đầu vào, tuy nhiên, nó chỉ in địa chỉ của một cái gì đó trên std::cout
. Khi viết vào một tham chiếu của một đối tượng tạm thời, Logger().stream()
, hoạt động như mong đợi.
Tại sao điều đó lại xảy ra?
Btw, hành vi này chỉ xảy ra trong C++ 98-land (ideone), mà tôi phải sử dụng. Với C++ 11 (coliru) và C++ 14 (ideone) cả hai biến thể cuộc gọi đều hoạt động như mong đợi. Có gì khác trong C++ 11/14?
#include <iostream>
#include <sstream>
class Logger : public std::ostringstream
{
public:
~Logger()
{
std::cout << this->str() << std::endl;
}
Logger& stream()
{
return *this;
}
};
int main(int argc, char ** argv)
{
// 1.
// Prints an address, e.g. 0x106e89d5c.
Logger() << "foo";
// 2.
// Works as expected.
Logger().stream() << "foo";
// What is the difference between 1. and 2.?
return 0;
}