次のコードはVisual Studio 2008ではコンパイルされますが、Visual Studio 2013以降では失敗します。ストリーム演算子>>をブール値として評価する
std::string str("foo");
std::stringstream ss(str);
float f = 0;
if ((ss >> f) == false)
std::cout << "Parse error\n";
エラーメッセージが
エラーC2678ある:バイナリ '==':NOオペレータが見つからないタイプの左手 オペランドをとる 'STD :: basic_istream>'(または存在 受け入れ可能な変換)
はなく、以下のように正常に変更することによって固定されている:
if (!(ss >> f))
std::cout << "Parse error\n";
私はこれをよく理解していません。私の質問は、演算子やキャスト、あるいはios
のフラグがストリームの読み取りを最初にブール値として評価できるようにするためのフラグで、operator==
が足りないのはなぜですか?
「bool」演算子の明示的な変換に関する例外の1つで、 'operator bool'が' explicit'とマークされていても、 'if(foo)'や 'if(!foo)'が機能することがあります。例[ここ](http://coliru.stacked-crooked.com/a/e884a7adaf92a472)。私はこれを**文脈変換**といいます。 [このブログの投稿](http://chris-sharpe.blogspot.ca/2013/07/contextually-converted-to-bool.html)。 – vsoftco
'NULL'は、" the "ヌルポインタ定数ではなく、" nullポインタ定数 "という用語の同義語でもなく、* a *ヌルポインタ定数に展開されるマクロです。 –