我最近开始在我的代码中使用更多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是否存在其他问题,因为我并没有真正看到有人这样写过。
答案 0 :(得分:10)
这是一个说明符,例如long
,short
,unsigned
等。它们都可以移动。例如,以下是两个等效且有效的声明:
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的回答是正确的:)