Почему ошибка static_assert: «выражение должно иметь постоянное значение», даже если я передаю константы? - PullRequest
0 голосов
/ 18 февраля 2020

Этот фрагмент кода скомпилирован без проблем:

const int tmp1 = 1, tmp2 = 1;
const bool cmp = (tmp1 == tmp2);
static_assert(cmp, "OK");

Этот код тоже подходит:

const bool cmp = (HUGE_VALF == HUGE_VALF);
static_assert(cmp, "OK");

Этот код не является:

const auto tmp = HUGE_VALF;
const bool cmp = (tmp == tmp);
static_assert(cmp, "OK");   // <-- error

Ошибка: выражение должно иметь постоянное значение.
Значение переменной "cmp" нельзя использовать в качестве константы

То же поведение с static const.

Что не так? HUGE_VALF - это макрос препроцессора, то есть константа, а cmp - без сомнения, постоянная времени компиляции ...

Среда:
Microsoft Windows 10
Microsoft Visual C ++ 2013 & 2019

1 Ответ

0 голосов
/ 18 февраля 2020

С этой тестовой программой я столкнулся с проблемой:

#include <cmath>

constexpr auto val1 = 1.23f;
constexpr auto val2 = HUGE_VALF;

static_assert(val1 == val1, "OK");
static_assert(val2 == val2, "OK");

int main()
{
}

Результат:

  • Visual C ++ 2019 32 бита: ОК
  • Visual C ++ 2019 64 биты: OK
  • Visual C ++ 2013 32 бита: OK
  • Visual C ++ 2013 64 бита: сбой

Вывод:

1>  TestConstexpr.cpp(5): error C2144: syntax error : 'auto' should be preceded by ';'
1>  TestConstexpr.cpp(5): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>  TestConstexpr.cpp(6): error C2144: syntax error : 'auto' should be preceded by ';'
1>  TestConstexpr.cpp(6): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>  TestConstexpr.cpp(6): error C2086: 'int constexpr' : redefinition
1>          TestConstexpr.cpp(5) : see declaration of 'constexpr'
1>  TestConstexpr.cpp(8): error C2057: expected constant expression
1>  TestConstexpr.cpp(9): error C2057: expected constant expression
...