Hãy xem xét ví dụ sau:điều hành chuyển đổi ngầm định không đá với nhà khai thác quá tải
#include <string>
#include <sstream>
struct Location {
unsigned line;
template<typename CharT, typename Traits>
operator std::basic_string<CharT, Traits>() const {
std::basic_ostringstream<CharT, Traits> ss;
ss << line;
return ss.str();
}
};
int main()
{
using namespace std::string_literals;
Location loc{42};
std::string s1 = "Line: "s.append(loc) + "\n"s; // fine
//std::string s2 = "Line: "s + loc + "\n"s; // error
}
Điểm mấu nhận xét gây ra một lỗi biên dịch: no match for 'operator+'
. Tại sao? Suy nghĩ ban đầu của tôi là lần đầu tiên nó sẽ sử dụng operator std::string
để chuyển đổi và sau đó thực hiện cuộc gọi đến operator+
, tương tự như vậy đối với .append
.
Nó chỉ là một cấp độ chuyển đổi tiềm ẩn, vì vậy nó cần được thực hiện và cần được tính đến, phải không?
Xin lỗi vì đã hỏi, nhưng tôi không thấy nhận mã làm việc. 'S' là gì? – gsamaras
@gsamaras http://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s – Holt
Đúng @Holt, cảm ơn! – gsamaras