考虑以下示例:
#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
}
注释行导致编译错误:no match for 'operator+'
. 为什么?我最初的想法是,它首先会operator std::string
用于转换,然后执行对 的调用operator+
,就像它对.append
.
它只是隐式转换的一级,所以应该执行并且应该考虑到它,不是吗?