C++constexpr关键字放置

C++ constexpr keyword placement

本文关键字:关键字 C++constexpr      更新时间:2023-10-16

我最近开始在代码中使用更多的C++11功能,我一直在想constexpr关键字的位置是否在常量的类型之前或之后有区别。

样式1:

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

样式2:

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

样式2是我更喜欢放置const关键字的方式,而以同样的方式放置constexpr会给代码带来一些一致性。然而,这被认为是糟糕的做法,还是风格2有其他问题,因为我真的没有看到有人这样写。

它是一个说明符,如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

msdn将语法定义为:

constexpr文字类型标识符=常量表达式;constexpr文本类型标识符{常量表达式};constexpr文字类型标识符(params);constexpr ctor(params);

上面写着你应该在左边使用它。

编辑:

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

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

存储类说明符

类型说明符

函数说明符

朋友

typedef

constexpr

这里给出了对这些说明符的解释。

综上所述,@chris的回答是正确的:)