免责声明:这个问题是为了理解。我会boost::lexical_cast在现场使用。不过,它已经在现实世界的某些地方出现了。
对“内联” 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;
}
结果类似于0x804947c0,因为使用的operator<<是"hi"自由函数,其 LHS 必须采用std::ostream&†,并且临时std::ostringstream()不能绑定到 ref-to-non- const。唯一剩下的比赛operator<<是const void*RHS ††。
现在让我们交换操作数:
#include <string>
#include <sstream>
#include <iostream>
int main()
{
const std::string s = static_cast<std::ostringstream&>(
std::ostringstream() << 0 << "hi"
).str();
std::cout << s;
}
结果是"0hi"。
这主要是有道理的,因为operator<<that是 base †††int的成员函数,因此可以在临时调用。该操作的结果是对基址的引用,下一个链接到该基址,即将其读取为.ostreamostreamoperator<<(std::ostringstream() << 0) << "hi"
但是为什么那个操作"hi"会继续产生预期的结果呢?LHS上的参考不是还是暂时的吗?
让我们关注C++03;有人告诉我,由于右值的全能运算符,第一个示例实际上可能在 C++11 中按“预期”工作。
† [C++03: 27.6.2.1]: template<class charT, class traits>
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&,charT*);
†† [C++03: 27.6.2.1]: basic_ostream<charT,traits>& operator<<(const void* p);
††† [C++03: 27.6.2.1]: basic_ostream<charT,traits>& operator<<(int n);