Я привык писать эту идиому:
assert(!"Something went wrong");
Но сейчас в проекте включили -Wconversion, и этот код больше не компилируется:
error: implicit conversion turns string literal into bool
Я понимаю, что если я приведу его явно, ошибка исчезнет, но это слишком громоздко:
assert(!static_cast<bool>("Something went wrong"));
Есть ли более элегантное решение для этого?
Будет ли это работать? assert( ("Something went wrong", false) ); потому что внутреннее выражение использует оператор-запятую для оценки false, сохраняя при этом ваш строковый литерал для удобочитаемости?
@abelenky • вероятно, придется сделать assert(((void)"Something went wrong", 0)); (либо 0, либо false, но 0 короче), или отключить другую ошибку, связанную с отброшенными значениями и оператором запятой.
@abelenky Мне это нравится, это может быть ответом :-)
inline bool operator""_fail(char const*, std::size_t) { return false; }, а затем assert("Something went wrong"_fail); может быть удобно.





Это может работать, в зависимости от всех ваших конкретных настроек компилятора:
assert( ("Something went wrong", false) );
Внутреннее выражение использует оператор-запятую для оценки значения false, сохраняя при этом строковый литерал для удобочитаемости.
Вы также можете заменить false на 0 для краткости.
Если это должно быть просто cassert, я бы пошел с
assert(0 && "something went wrong");
Это должно работать из-за того, что && и 0 являются «истинными» (неявно преобразуемыми в логические).
В противном случае используйте лучшую библиотеку утверждений в целом, например snowhouse или libassert
Или assert(0**"something went wrong"); = 0 в степени «что-то пошло не так» (в питоническом мышлении)
И мои варианты, короче другие ранее ответили:
assert(!"something went wrong"[0]);
assert(!*"something went wrong");
Круто, второй мне нравится!
@ivaigult Ваш тоже хорош. Только хотел добавить, но ты был первым.
Еще один, который я придумал:
assert(!&"Something went wrong");
Это будет работать, поскольку &"Something went wrong" — это адрес постоянной строки, которая не должна быть нулевой. И ! будет отрицать это, так что это false.
Обычная идиома для утверждения с сообщением такова:
assert(condition_that_should_be_true && "something went wrong");
Если вы хотите безоговорочно потерпеть неудачу, вы можете просто сделать это условие false:
assert(false && "something went wrong");
Но учтите, что вам редко нужно это делать. Например:
if (!check_conditions()) assert(false && "something went wrong");
// Can simply be
assert(check_conditions() && "something went wrong");
Написать свой собственный макрос утверждения?