static,constexpr,const - 当它们一起使用时它们意味着什么?

hg_*_*git 7 c++ static const constexpr c++11

我与这些说明完全失望,因为我明白,当他们自己,他们做什么,但我发现时,他们互相用他们很难理解.例如,野外的一些代码包含 -

namespace{
static constexpr char const *Hello[] = { "HelloString", "WorldString"};
...
}
Run Code Online (Sandbox Code Playgroud)

这甚至做了什么?

  • 当你已经在匿名命名空间内时,为什么要使用static.并且内部静态是有意义的(除非你编写缺少命名空间的C),没有类 - 为什么?
  • 为什么要使用constexpr - 这里没有理由使用它.会不会很简单const呢?
  • 然后const *Hello对我没有意义.这里有什么不变的?字符串或指针*Hello

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

Wea*_*ish 6

为什么在已经在匿名命名空间内时使用静态?

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

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

同样,这里没有必要,但它确实表明它是一个编译时常量.还要注意,constexpr这里的意思是指针constexpr,并且删除了const之后的需要*(参见下一部分).

const *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
Run Code Online (Sandbox Code Playgroud)

我发现"左右"规则中的这个页面确实有助于理解复杂的声明.