c++ - 什么是 !!在下面的宏中?

标签 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

我不明白为什么我们需要!!在上面的宏中。您能否举例说明重载的运算符最终可能会出现在运算符 || 处?

最佳答案

这是一个例子:

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 转换为 bool 值,如果不为零则为 true。在第二种情况下,! 运算符给出了不同的结果。

关于c++ - 什么是 !!在下面的宏中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19515684/

相关文章:

c - linux 内核 `min` 宏

c++ - 在 Mac 上使用 CDT 的 Eclipse

c - C 中的未命名参数

functional-programming - 请在 Scheme 中重构我的宏

c++ - 消除 `boost::xtime`中的 `boost::condition::timed_wait`

parsing - 可以区分 foo[.2] 和 foo[.20] 的 Mathematica 函数 foo

macros - 放!全局来自 Scheme 宏?

c++ - 动态规划 - 事件选择

c++ - 如何将模板类中的模板函数转换为函数指针

c++ - 什么是 rvalues、lvalues、xvalues、glvalues 和 prvalues?