C ++ constexpr关键字放置

时间:2015-12-28 23:01:28

标签: c++ c++11 constexpr

我最近开始在我的代码中使用更多C ++ 11功能,我一直想知道constexpr关键字的位置是否会在常量类型之前或之后产生差异。< / p>

风格1:

constexpr int FOO = 1;
constexpr auto BAR = "bar";

样式2:

int constexpr FOO = 1;
auto constexpr BAR = "bar";

样式2是我更喜欢放置const关键字的方式,并且以相同的方式放置constexpr会为代码带来一些一致性。然而,这被认为是不好的做法,或者风格2是否存在其他问题,因为我并没有真正看到有人这样写过。

2 个答案:

答案 0 :(得分:10)

这是一个说明符,例如longshortunsigned等。它们都可以移动。例如,以下是两个等效且有效的声明:

int long const long unsigned constexpr foo = 5;
constexpr const unsigned long long int foo = 5;

按照惯例,constexpr会出现在类型名称之前。如果你把它放在后面,它会让别人感到困惑,但它在技术上是有效的。由于constexpr的目的不同于const,因此我认为将其放在右侧并没有同样的好处。例如,您无法执行int constexpr * constexpr foo。实际上,int constexpr * foo将不允许您重新分配foo,而不是应用于foo指向的内容,因此如果您期望相同类型的语义,将其置于右侧可能会产生误导为const

总结:

int constexpr foo = 0; // valid
int constexpr * constexpr foo = nullptr; // invalid
int* constexpr foo = nullptr; // invalid
int constexpr * foo = nullptr; // valid
constexpr int* foo = nullptr; // valid and same as previous

答案 1 :(得分:1)

msdn将语法定义为:

  

constexpr literal-type identifier = constant-expression; constexpr literal-type identifier {constant-expression}; constexpr literal-type identifier(params); constexpr ctor(params);

其中说你应该在左边使用它。

修改

  

新说明符关键字constexpr是一个声明说明符;修改   [ISO03,§7.1]中的语法如下:

     

1可以在声明中使用的说明符是   DECL说明符:

     

存储类说明符

     

型说明符

     

功能说明符

     

朋友

     

的typedef

     

constexpr

对这个说明符here给出了解释。

总结@chris的回答是正确的:)