- ベストアンサー
VC++2010 Express Editionでのbasic_ostream::sentry::operator bool( )の利用方法となくなった理由
- VC++2010 Express Editionでは、basic_ostream::sentry::operator bool( )を使用するためには、_OPERATOR_BOOL()メソッドを使用する必要があります。
- VC++2010 Express Editionからbasic_ostream::sentry::operator bool( )がなくなった理由は不明です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
僕はC++ストリームやC++0xに詳しくないのではっきりとしたことは言えませんが、参考までにどうぞ。 1) に関しては下記コードのような普通の使い方をしていれば、VC 2008以前でもVC 2010でも同じコードでコンパイルが通るはずです。 2) に関しては、VC 2010では単純なbool型でなく、「構造体メンバーへのポインタ型(オフセット アドレスを表す)」が使われていることから、おそらくコンパイラのC++0x対応の都合上かと思われます。 #include <iostream> #include <conio.h> using namespace std; int main() { const ostream::sentry ok(cout); // ストリームのステータス チェック。 cout << (ok ? "OK." : "NG.") << endl; // 普通の使い方。operator bool() const に相当する演算子オーバーロードが呼ばれる。 cout << endl; // 戻り値の型をテストするために、意図的に推奨されない呼び出し方をしています。 auto var1 = ok.operator std::_Bool_type(); // _Bool_struct メンバーへのポインタ型。_OPERATOR_BOOL の戻り値と同じ型。 cout << var1 << endl; cout << sizeof(var1) << endl; cout << typeid(var1).name() << endl; cout << endl; auto var2 = &_Bool_struct::_Member; // _Bool_struct メンバーへのポインタ型。_CONVERTIBLE_TO_TRUE と同じ型。 cout << var2 << endl; cout << sizeof(var2) << endl; cout << typeid(var2).name() << endl; cout << endl; int* p = nullptr; // 通常のポインタ型は、構造体/クラス メンバーへのポインタ型とは代入互換性がない。 cout << p << endl; cout << sizeof(p) << endl; cout << typeid(p).name() << endl; cout << endl; cout << "Press any key..." << endl; _getch(); }
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
#1 で言われるように「C++0x 対応の都合」... というか, より厳密には「C++0x に対応『していない部分』の都合」のようです. C++0x では sentry の operator bool は explicit operator bool() const になっているのですが, VC10 では「explicit な変換」に対応していません. そのためにこのようなことになっているようです. という話が http://connect.microsoft.com/VisualStudio/feedback/details/471695/implementation-of-basic-istream-sentry-operator-bool-might-violate-2003-standard 出ております.
お礼
ありがとうございます。 そんな事情があったんですね。
お礼
サンプルまで作って頂き、ありがとうございます。 すごくすっきりしました。