我正在阅读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
我无法理解为什么我们需要!!在上面的宏。你能给出一个例子,一个重载的运算符最终可以在运算符||?
答案 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。在第二个中,!
运算符给出了不同的结果。