Как я могу исправить эту ошибку "значение 'x1' не может использоваться в константном выражении"? static_assert - PullRequest
0 голосов
/ 29 июня 2018

Учитывая следующий код ( только для примера ):

    int x1 = 4;
    int x2 = 5;
    static_assert(x1 != x2 ,"Error");

Я получаю следующую ошибку:

значение 'x1' нельзя использовать в постоянном выражении

Как я могу это исправить?


Примечание: я искал способ исправить это без изменения определений переменных следующим образом:

const int x1 = 4;
const int x2 = 5;

Но я хочу исправить это только путем изменения строки static_assert(..)

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Вы должны использовать время выполнения утверждение типа:

#include <cassert>

// ...

int x1 = 4;
int x2 = 5;

assert(x1 != x2);

Примечание: Runtime утверждения с использованием assert применяются только при компиляции в режиме отладки, они удаляются при компиляции в режиме release . Из-за этого они не замедляют работу приложения. Они нулевая стоимость , поэтому вы можете (и, возможно, следует ) использовать их свободно для проверки граничных условий и общей правильности.

Важное соображение (props @Bathsheba) заключается в том, что эти утверждения должны не вызывать побочные эффекты , потому что тогда поведение между отладочная версия и выпускная версия будут отличаться.

например.

// in the release version x2 will NOT be incremented!!!
assert(x1 != x2++); // BAD!!
0 голосов
/ 29 июня 2018

Ну, правильное исправление -

constexpr int x1 = 4;
constexpr int x2 = 5;

Иначе, как компилятор узнает (в полной общности и согласованности), что x1 и x2 являются вычисляемыми константными выражениями во время компиляции?

Если x1 и x2 должны быть int типов, тогда вам нужно использовать утверждение run-time , такое как assert:

assert(x1 != x2)

Но учтите, что выражение, переданное assert, не вычисляется, если определено NDEBUG. Это может вызвать проблемы с различными конфигурациями сборки, если у выражения есть побочные эффекты.

Ссылка: https://en.cppreference.com/w/cpp/error/assert

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...