什么!!在下面的宏中做什么?

时间:2013-10-22 10:46:14

标签: c++ macros

我正在阅读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

我无法理解为什么我们需要!!在上面的宏。你能给出一个例子,一个重载的运算符最终可以在运算符||?

1 个答案:

答案 0 :(得分: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。在第二个中,!运算符给出了不同的结果。