【问题标题】:constexpr versus anonymous namespaceconstexpr 与匿名命名空间
【发布时间】:2019-03-25 11:08:04
【问题描述】:

以下两种创建 const 值的模式有什么区别?

constexpr int some_val = 0;

namespace {
   const int some_val = 0;
}

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

【问题讨论】:

  • 为什么你使用第二种方法?特别是,您认为在这里使用未命名的命名空间有什么影响?我怀疑你对它的影响不是很清楚(= 不存在)。
  • 未命名的命名空间将与 static 进行比较,而不是 constexpr
  • 为什么将第二个选项放在命名空间中?这背后有什么原因吗? Q 的标题有点像比较苹果和橘子。
  • @Jarod42 这将是我使用第二种方法的意图。 constexpr 主要由编译器用来替换值吗?
  • 类似问题:constexpr vs static const.

标签: c++ c++11 namespaces


【解决方案1】:

未命名的命名空间充当static:变量的链接。

namespace {
   const int some_val = 0;
}

相当于:

static const int some_val = 0;

constexpr 不会改变这一点:Demo

现在我们可以比较 constconstexpr

  • 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多