有趣的部分是:
#define INTERNAL_CATCH_TEST( expr, resultDisposition, macroName ) \
do { \
Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
try { \
CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
( __catchResult <= expr ).endExpression(); \
CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \
} \
catch( ... ) { \
__catchResult.useActiveException( resultDisposition ); \
} \
INTERNAL_CATCH_REACT( __catchResult ) \
} while( Catch::isTrue( false && static_cast<bool>( !!(expr) ) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look
// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.
或expr
在哪里。x == y
eq(x, y)
它是如何工作的 x == y
:
__catchResult <= expr
结果__catchResult <= x == y
相当于(__catchResult <= x) == y
由于<=
比较的优先级较低==
(参见C++ 运算符优先级)。__catchResult <= x
用操作符包装x
在一个对象中,该==
操作符y
被传递给。这就是expr
被解构的方式。其余的一切都很容易想象。
为什么它不起作用 eq(x, y)
:
__catchResult <= expr
结果__catchResult <= eq(x, y)
并eq(x, y)
首先被评估(无解构)。
出于同样的原因,如果表达式被括号括起来,它也不起作用。例如,(x == y)
将导致__catchResult <= (x == y)
在哪种情况下x == y
首先评估(无解构)。这就是为什么CHECK((x == y));
导致输出
/path/to/MyTest.cpp:8: Failure:
CHECK((x == y))
with expansion:
false