constexpr int и constexpr double в с ++ - PullRequest
       10

constexpr int и constexpr double в с ++

3 голосов
/ 23 октября 2019

Я столкнулся со странным случаем.

// this does not work, and reports:
// constexpr variable 'b' must be initialized by a constant expression
int main() {
  const double a = 1.0;
  constexpr double b = a;
  std::cout << b << std::endl;
}

// this works...
int main() {
  const int a = 1;
  constexpr int b = a;
  std::cout << b << std::endl;
}

ничего особенного в double, поэтому он не может заставить constexpr работать?

1 Ответ

3 голосов
/ 23 октября 2019

что-нибудь особенное в double, поэтому он не может заставить constexpr работать?

int s и double s ведут себя по-разному в этом случае.

Для основное константное выражение , a во 2-м случае (с типом int) может использоваться в константных выражениях , но a в 1-м случае (с типом double) нет.

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

  • неявное преобразование из lvalue в rvalue, если только ....

    • a. применяется к энергонезависимому значению glvalue, которое обозначает объект, который можно использовать в постоянных выражениях (см. ниже),

      int main() {
          const std::size_t tabsize = 50;
          int tab[tabsize]; // OK: tabsize is a constant expression
                            // because tabsize is usable in constant expressions
                            // because it has const-qualified integral type, and
                            // its initializer is a constant initializer
      
          std::size_t n = 50;
          const std::size_t sz = n;
          int tab2[sz]; // error: sz is not a constant expression
                        // because sz is not usable in constant expressions
                        // because its initializer was not a constant initializer
      }
      

и

(выделение мое)

Используется в константных выражениях В приведенном выше списке переменная может использоваться в константных выражениях, если она

  • переменная constexpr, или
  • это инициализированная константой переменная
    • ссылочного типа или
    • из константно-квалифицированного интеграла или типа перечисления.

Вы можете объявить a как constexpr, чтобы использовать его в постоянном выражении. например,

constexpr double a = 1.0;
constexpr double b = a;   // works fine now
...