【问题标题】:Static constexpr global variable [duplicate]静态 constexpr 全局变量 [重复]
【发布时间】:2020-04-06 00:43:15
【问题描述】:

在 C++17 中,像这样声明全局常量有什么区别:

namespace ns
{
static constexpr const auto global_variable = 47;
}

同时指定const 修饰符,并且:

namespace ns
{
static constexpr auto global_variable = 47;
}

没有指定const?如果是,有哪些区别,在哪些场景下推荐使用哪个版本的声明?

【问题讨论】:

  • 在 C++17 中你也可以定义一个全局常量 inline 而不是 static。或者只是在一个匿名命名空间中。
  • 在给出的例子中,没有。但是static constexpr char* global_variable = "Happy";constexpr 应用于type char*,就好像它是char* const。这不是你真正想要的。所以你需要做static constexpr char const* global_variable = "Happy";
  • @DeiDei 好吧,它已经在 namspace 中,在我的示例中,使用 inline 而不是 static 有什么好处?

标签: c++ static global-variables constants constexpr


【解决方案1】:

没有区别,对象类型变量上的constexpr说明符暗示const[dcl.constexpr]/9

对象声明中使用的constexpr 说明符将对象声明为const。 […]

请注意,static 在这里也是多余的,因为 const 限定类型已经暗示了内部链接 [basic.link]/3.2

具有命名空间范围的名称如果是

的名称,则具有内部链接
  • […]
  • 非易失性 const 限定类型的非内联变量,既没有显式声明 extern,也没有先前声明为具有外部链接 […]
  • […]

【讨论】:

    【解决方案2】:

    这里不需要constconstexpr 暗示const

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-28
      • 2018-12-22
      • 1970-01-01
      • 2020-06-11
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      相关资源
      最近更新 更多