【问题标题】:static, constexpr, const - what do they mean when all used together?static, constexpr, const - 当它们一起使用时它们是什么意思?
【发布时间】:2016-06-06 08:01:36
【问题描述】:

我对这些说明符感到非常沮丧,因为我理解它们单独使用时的作用,但我发现它们一起使用时很难理解。例如,一些野外代码包含 -

namespace{
static constexpr char const *Hello[] = { "HelloString", "WorldString"};
...
}

这还能做什么?

  • 当您已经在匿名命名空间中时,为什么还要使用静态。类中的静态是有意义的(除非您正在编写缺少名称空间的 C),没有类 - 为什么??
  • 为什么要使用 constexpr - 这里没有理由使用它。一个简单的const 不会吗?
  • 然后const *Hello 对我来说没有意义。什么是不变的?字符串或指针*Hello?

最糟糕的是,它编译:/。当然它会编译,因为它们是有效的语句,但它甚至意味着什么?

【问题讨论】:

  • constexpr 表明它使用的是 C++11。再次了解这个静态是有意义的,因为它将使初始化线程安全。 (魔术静力学)。并且 constexpr 使它可以在不能与 const 一起使用的地方使用。
  • 我不认为用花括号初始化列表编译标量。
  • 为什么魔法静态和线程安全对于加载时间初始化很重要......?那里会发生什么样的并行执行?
  • 如果您不介意,我已将问题编辑为看起来不太“在检查时可否决”的内容。不喜欢请回滚。
  • 你确定它可以编译吗?我看到了一个文字列表。假设只有一个字符串,而不是一个列表,那么该行看起来就像是从一个类中复制的一行,在这种情况下它是有意义的。

标签: c++ c++11 static constants constexpr


【解决方案1】:

当您已经在匿名命名空间中时,为什么还要使用静态?

我没有看到这里的理由,除非它是为了 C++03 兼容性而编写的。

为什么使用constexpr - 这里没有理由使用它。一个简单的 const 不会做吗?

同样,这里没有必要,但它确实表明它是一个编译时间常数。还要注意这里的constexpr 表示指针是constexpr,并且在* 之后不需要const(见下一部分)。

const *Hello 对我来说没有意义。什么是不变的?字符串或指针 *Hello?

const 适用于左侧,除非那里没有任何东西,在这种情况下它适用于右侧。 const 左边的* 表示取消引用时的指针是一个常量,而右边表示它是一个指向某物的常量指针。

char const * ptr = "Foo";
ptr[0] = 'B'; //error, ptr[0] is const

char * const ptr = "Foo";
ptr = new char[10]; //error, ptr is const

char const * const ptr = "Foo"; //cannot assign to either ptr or *ptr
constexpr char const* ptr = "Foo"; //same as above, constexpr replaced last const

我发现“右左”规则上的this 页面确实有助于理解复杂的声明。

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 2018-08-29
    • 2011-09-08
    • 1970-01-01
    • 2012-08-06
    • 2011-10-02
    • 1970-01-01
    • 2020-03-08
    • 2012-03-23
    相关资源
    最近更新 更多