我对这些说法者感到非常沮丧,因为我了解他们自己做了什么,但我发现当他们彼此使用时很难理解.例如,野外的一些代码包含 –
namespace{ static constexpr char const *Hello[] = { "HelloString","WorldString"}; ... }
这甚至做了什么?
>当你已经在匿名命名空间内时,为什么要使用static.并且内部静态是有意义的(除非你编写缺少命名空间的C),没有类 – 为什么?
>为什么要使用constexpr – 这里没有理由使用它.不会是一个简单的const会做什么?
>然后const * Hello对我没有意义.这里有什么不变的?字符串或指针*你好?
最糟糕的是,它编译:/.当然它会编译,因为它们是有效的陈述,但它甚至意味着什么?
解决方法
Why use static when you’re already inside an anonymous namespace?
我没有看到这里的理由,除非它是为C 03兼容性而写的.
Why use
constexpr
– there’s no reason to use it here. wouldn’t a simple const would do?
同样,这里没有必要,但它确实表明它是一个编译时常量.另请注意,constexpr在这里意味着指针是constexpr,并且在*之后不需要const(参见下一部分).
const *Hello
doesn’t makes sense to me. What is constant here? The strings or the pointer *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页真的有助于理解复杂的声明.