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;