constexpr против анонимного пространства имен - PullRequest
0 голосов
/ 25 марта 2019

В чем разница между следующими двумя шаблонами при создании значений констант?

constexpr int some_val = 0;

против

namespace {
   const int some_val = 0;
}

Я привык ко 2-му методу, но является ли 1-й эквивалент?

1 Ответ

1 голос
/ 25 марта 2019

безымянное пространство имен действует как static: связывание переменной.

namespace {
   const int some_val = 0;
}

эквивалентно:

static const int some_val = 0;

constexpr не меняет этого: Демо

Теперь мы можем сравнить const против constexpr:

  • constexpr переменные являются неизменяемыми значениями, известными во время компиляции (и поэтому могут использоваться в постоянном выражении)
  • const переменные являются неизменяемыми значениями, которые могут быть инициализированы во время выполнения.

чтобы вы могли иметь

int get_int() {
    int res = 0; 
    std::cin >> res;
    return res;
}

const int value = get_int();

но не

constexpr int value = get_int(); // Invalid, `get_int` is not and cannot be constexpr

Наконец, некоторые значения const рассматриваются как constexpr, как это было бы для:

const int some_val = 0; // equivalent to constexpr int some_val = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...