0

vc crt のソース コードを読んでいると、次のコード スニペットが見つかりました。

/* Asserts */
/* We use !! below to ensure that any overloaded operators used to evaluate expr do not end up at operator || */
#define _ASSERT_EXPR(expr, msg) \
        (void) ((!!(expr)) || \
                (1 != _CrtDbgReportW(_CRT_ASSERT, _CRT_WIDE(__FILE__), __LINE__, NULL, L"%s", msg)) || \
                (_CrtDbgBreak(), 0))

#ifndef _ASSERT
#define _ASSERT(expr)   _ASSERT_EXPR((expr), NULL)
#endif

なぜ必要なのか理解できません!! 上記のマクロで . オーバーロードされた演算子が演算子 || になる可能性がある例を挙げていただけますか?

4

1 に答える 1

2

次に例を示します。

struct Evil {
    int number;
    bool valid;

    operator int() {return number;}
    bool operator!() {return !valid;}
};

Evil evil {42, false};
if (evil)   {std::cout << "It's not zero\n";}
if (!!evil) {std::cout << "It's valid\n";}

最初のケースでは、 への暗黙的な変換によってブール値に変換されint、ゼロでない場合は true になります。2 番目の!演算子では、異なる結果が返されます。

于 2013-10-22T10:53:41.067 に答える