C++ constexpr与匿名名称空间

C++ constexpr与匿名名称空间,c++,c++11,namespaces,C++,C++11,Namespaces,以下两种模式在创建常量值时有什么不同 constexpr int some_val = 0; vs 我已经习惯了第二种方法,但是第一种方法是等效的吗?未命名的名称空间充当静态的:变量的链接 namespace { const int some_val = 0; } 相当于: static const int some_val = 0; constexpr不会改变这一点: 现在我们可以比较const和constepr: constexpr变量是编译时已知的不可变值(因此可以在常量表达

以下两种模式在创建常量值时有什么不同

constexpr int some_val = 0;
vs

我已经习惯了第二种方法,但是第一种方法是等效的吗?

未命名的名称空间充当
静态的
:变量的链接

namespace {
   const int some_val = 0;
}
相当于:

static const int some_val = 0;
constexpr
不会改变这一点:

现在我们可以比较
const
constepr

  • 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
值被视为
constepr
,因为它适用于:

const int some_val = 0; // equivalent to constexpr int some_val = 0;

你为什么要用第二种方法?特别是,您认为在这里使用未命名名称空间的效果如何?我怀疑您不太清楚它的影响(=不存在)。未命名的命名空间将与
static
,而不是
constexpr
。为什么要将第二个选项放在命名空间中?这背后有什么原因吗?你Q的标题有点像比较苹果和橙子。@Jarod42这就是我对第二种方法的意图。编译器是否主要使用constexpr替换该值?类似问题:。
const int some_val = 0; // equivalent to constexpr int some_val = 0;