Hãy xem xét các chức năng sau:Quay stringstream tạm thời để c_str() trong câu lệnh
void f(const char* str);
Giả sử tôi muốn tạo ra một chuỗi sử dụng stringstream và vượt qua nó để chức năng này. Nếu tôi muốn làm điều đó trong một tuyên bố, tôi có thể thử:
f((std::ostringstream() << "Value: " << 5).str().c_str()); // error
Điều này cho biết lỗi: 'str()' không phải là thành viên của 'basic_ostream'. OK, vậy nhà điều hành < < đang trở lại ostream thay vì ostringstream - làm thế nào về việc đưa nó trở lại một ostringstream?
1) Truyền này có an toàn không?
f(static_cast<std::ostringstream&>(std::ostringstream() << "Value: " << 5).str().c_str()); // incorrect output
Bây giờ với điều này, nó quay ra cho các nhà điều hành < < ("giá trị gia tăng:") cuộc gọi, nó thực sự kêu gọi hành ostream của < < (void *) và in một địa chỉ hex. Điều này là sai, tôi muốn văn bản.
2) Tại sao toán tử < < trên std tạm thời :: ostringstream() gọi toán tử ostream? Chắc chắn tạm thời có một loại 'ostringstream' không phải là 'ostream'?
Tôi có thể truyền tạm thời để thực hiện cuộc gọi của nhà điều hành chính xác!
f(static_cast<std::ostringstream&>(static_cast<std::ostringstream&>(std::ostringstream()) << "Value: " << 5).str().c_str());
Điều này dường như làm việc và vượt qua "Giá trị: 5" đến f().
3) Hiện tại tôi có dựa vào hành vi không xác định không? Các phôi trông khác thường.
Tôi biết phương án tốt nhất là một cái gì đó như thế này:
std::ostringstream ss;
ss << "Value: " << 5;
f(ss.str().c_str());
... nhưng tôi quan tâm đến hành vi làm việc đó trong một dòng. Giả sử ai đó muốn tạo macro (đáng ngờ):
#define make_temporary_cstr(x) (static_cast<std::ostringstream&>(static_cast<std::ostringstream&>(std::ostringstream()) << x).str().c_str())
// ...
f(make_temporary_cstr("Value: " << 5));
Chức năng này có được mong đợi không?
Trùng lặp có thể xảy ra do nhầm lẫn chuyển đổi [stringstream, string và char \ *] (http://stackoverflow.com/questions/1374468/stringstream-string-and-char-conversion-confusion). – jww