Tuyên bố từ chối trách nhiệm: Câu hỏi này dành cho sự hiểu biết. Tôi sẽ sử dụng boost::lexical_cast
trong trường. It has sort of come up in the real world in places, though.Đây có phải là một thể hiện của tham chiếu đến không ràng buộc với một tạm thời không?
Hãy the following attempt tại một "inline" cách tiếp cận lex-cast:
#include <string>
#include <sstream>
#include <iostream>
int main()
{
const std::string s = static_cast<std::ostringstream&>(
std::ostringstream() << "hi" << 0
).str();
std::cout << s;
}
Kết quả là một cái gì đó giống như 0x804947c0
, vì operator<<
làm việc với "hi"
là một chức năng miễn phí mà LHS phải mất std::ostream&
& dagger; và tạm thời std::ostringstream()
không thể liên kết với một ref-to-non const
. Trận đấu còn lại duy nhất là operator<<
mất const void*
trên RHS & dagger; & dagger;.
Bây giờ let's swap the operands:
#include <string>
#include <sstream>
#include <iostream>
int main()
{
const std::string s = static_cast<std::ostringstream&>(
std::ostringstream() << 0 << "hi"
).str();
std::cout << s;
}
Kết quả là "0hi"
.
này chủ yếu có ý nghĩa, bởi vì operator<<
rằng mất int
là một hàm thành viên của cơ sở ostream
& dao găm; & dao găm; & dao găm; và, như vậy, là tốt với được gọi trên tạm thời. Kết quả của hoạt động đó là tham chiếu đến cơ sở ostream
, trong đó operator<<
tiếp theo bị xích, tức là đọc nó là (std::ostringstream() << 0) << "hi"
.
Nhưng tại sao sau đó hoạt động trên "hi"
tiếp tục mang lại kết quả mong đợi? Không phải là tài liệu tham khảo về LHS vẫn là tạm thời?
Hãy tập trung vào C++ 03; Tôi đã nói rằng ví dụ đầu tiên có thể thực sự hoạt động như "dự định" trong C++ 11 do toán tử catch-all cho các giá trị.
& dagger;[C++03: 27.6.2.1]: template<class charT, class traits> basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&,charT*);
& dagger; & dagger;[C++03: 27.6.2.1]: basic_ostream<charT,traits>& operator<<(const void* p);
& dagger; & dagger; & dagger;[C++03: 27.6.2.1]: basic_ostream<charT,traits>& operator<<(int n);
Tôi đoán câu trả lời là một cái gì đó dọc theo dòng "các quy tắc cho thời gian ràng buộc để tham chiếu là hư không gần đó đơn giản, đây là những cụm từ thích hợp". –
Điều này làm việc cho cùng một lý do mà bạn có thể viết một mẫu chức năng 'mẫu T & lvalue (T && v) {return v;}' để ràng buộc các tham chiếu không phải const lvalue vào thời gian. –
Mankarse
Sẽ không phải là quá tải cho chú thích đầu tiên của bạn được những người mà mất 'const char [T] *'? (Không phải là nó thay đổi bất cứ điều gì.) – Mat