免責事項:この質問は理解のためのものです。現場で使用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
です。残っている唯一の一致は、RHS ††operator<<
を引き受けるものです。const void*
それでは、オペランドを交換しましょう:
#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<<
それは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);