C++constexpr关键字放置
C++ constexpr keyword placement
我最近开始在代码中使用更多的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有其他问题,因为我真的没有看到有人这样写。
它是一个说明符,如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
msdn将语法定义为:
constexpr文字类型标识符=常量表达式;constexpr文本类型标识符{常量表达式};constexpr文字类型标识符(params);constexpr ctor(params);
上面写着你应该在左边使用它。
编辑:
新说明符关键字constexpr是一个声明说明符;修改[ISO03,§7.1]中的语法如下:
1可以在声明中使用的说明符是decl说明符:
存储类说明符
类型说明符
函数说明符
朋友
typedef
constexpr
这里给出了对这些说明符的解释。
综上所述,@chris的回答是正确的:)
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- "friend"关键字在C++中是什么意思?
- 声明C++数组(带或不带 "new" 关键字)
- 对齐和对齐的实际用例C++关键字
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- 在 Objective-C++ -> EXC_BAD_ACCESS Error 中使用"new"关键字