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,如果不为零,则为真。在第二种情况下,!操作员给出了不同的结果。

于 2013-10-22T10:53:41.067 回答