什么 !!在以下宏中吗?

What's !! does in the following macro?

本文关键字:什么      更新时间:2023-10-16

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

我不明白为什么我们需要!! 在上面的宏中.你能举一个例子,一个重载的运算符可能最终出现在运算符||?

下面是一个示例:

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 zeron";}
if (!!evil) {std::cout << "It's validn";}

在第一种情况下,它通过隐式转换为int转换为布尔值,如果不是零,则给出 true。在第二个中,!运算符给出不同的结果。