-Wconversion и неявная строка в логическое приведение

Я привык писать эту идиому:

assert(!"Something went wrong");

Но сейчас в проекте включили -Wconversion, и этот код больше не компилируется:

error: implicit conversion turns string literal into bool

Я понимаю, что если я приведу его явно, ошибка исчезнет, ​​но это слишком громоздко:

assert(!static_cast<bool>("Something went wrong"));

Есть ли более элегантное решение для этого?

Написать свой собственный макрос утверждения?

Alan Birtles 26.06.2023 20:17

Будет ли это работать? assert( ("Something went wrong", false) ); потому что внутреннее выражение использует оператор-запятую для оценки false, сохраняя при этом ваш строковый литерал для удобочитаемости?

abelenky 26.06.2023 20:20

@abelenky • вероятно, придется сделать assert(((void)"Something went wrong", 0)); (либо 0, либо false, но 0 короче), или отключить другую ошибку, связанную с отброшенными значениями и оператором запятой.

Eljay 26.06.2023 20:21

@abelenky Мне это нравится, это может быть ответом :-)

ivaigult 26.06.2023 20:23
inline bool operator""_fail(char const*, std::size_t) { return false; }, а затем assert("Something went wrong"_fail); может быть удобно.
Eljay 26.06.2023 20:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
79
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Это может работать, в зависимости от всех ваших конкретных настроек компилятора:

assert( ("Something went wrong", false) );

Внутреннее выражение использует оператор-запятую для оценки значения false, сохраняя при этом строковый литерал для удобочитаемости.

Вы также можете заменить false на 0 для краткости.

Если это должно быть просто cassert, я бы пошел с

assert(0 && "something went wrong");

Это должно работать из-за того, что && и 0 являются «истинными» (неявно преобразуемыми в логические).

В противном случае используйте лучшую библиотеку утверждений в целом, например snowhouse или libassert

Или assert(0**"something went wrong"); = 0 в степени «что-то пошло не так» (в питоническом мышлении)

Thomas Weller 26.06.2023 20:56
Ответ принят как подходящий

И мои варианты, короче другие ранее ответили:

assert(!"something went wrong"[0]);
assert(!*"something went wrong");

Круто, второй мне нравится!

ivaigult 26.06.2023 20:35

@ivaigult Ваш тоже хорош. Только хотел добавить, но ты был первым.

273K 26.06.2023 20:36

Еще один, который я придумал:

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");

Другие вопросы по теме