Если я запускаю следующий тест ведьмы Ловить
bool eq(int x, int y) {
return x == y;
}
TEST_CASE("operator vs. function call") {
int x = 1;
int y = 2;
CHECK(x == y);
CHECK(eq(x, y));
}
Я получаю следующий вывод
/path/to/MyTest.cpp:8: Failure:
CHECK(x == y)
with expansion:
1 == 2
/path/to/MyTest.cpp:9: Failure:
CHECK(eq(x, y))
with expansion:
false
Почему можно поймать конвертировать x
а также y
к строкам в выражении оператора x == y
но не в выражении вызова функции eq(x, y)
? Можно ли каким-то образом привести в порядок выражение вызова функции, чтобы получить вывод, подобный этому:
/path/to/MyTest.cpp:9: Failure:
CHECK(eq(x, y))
with expansion:
eq(1, 2)
Я подозреваю один раз CHECK
видит eq(x, y)
он просто видит результат этого вызова функции как выражение.
Вы можете вставить INFO
до вашего CHECK
чтобы увидеть параметры вашего вызова функции:
INFO("x:" << x << ", y:" << y);
CHECK(eq(x, y));
который будет зарегистрирован на CHECK
вызов (показывает «с сообщением»):
CHECK( eq(x, y) )
with expansion:
false
with message:
x:1, y:2
Интересная часть этот:
#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