免责声明:这个问题是为了理解。我会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
的成员函数,因此可以在临时调用。该操作的结果是对基址的引用,下一个链接到该基址,即将其读取为.ostream
ostream
operator<<
(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);