безымянное пространство имен действует как 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;