这是一个自动生成的 header (由Flatbuffer序列化程序生成),我从未见过像Color (&EnumValuesColor())[3] {...}
这样的语法可以有人解释吗?
enum Color {
Color_Red = 0,
Color_Green = 1,
Color_Blue = 2,
Color_MIN = Color_Red,
Color_MAX = Color_Blue
};
inline const Color (&EnumValuesColor())[3] {
static const Color values[] = {
Color_Red,
Color_Green,
Color_Blue
};
return values;
}
最佳答案
您不认识它就不足为奇了;这是我们从C继承的一些非常神秘的声明符诡计的示例,与所谓的“spiral rule”有关。
这里发生的是:
EnumValuesColor
的函数const Color
s inline
您可以使用https://cdecl.org来帮助您解析这样的超复杂声明,但是请注意,您必须将
Color
替换为int
,否则它不会知道您在谈论一种类型:从C++ 14开始,您可能更喜欢这样编写函数声明:
inline auto& EnumValuesColor() {
static const Color values[] = {
Color_Red,
Color_Green,
Color_Blue
};
return values;
}
现在,在如此小的函数中,只需观察我们直接返回一个const Color values[]
(并在其中粘贴3
),就可以更轻松地了解到底发生了什么。我绝对不是推荐“几乎总是自动”的人之一,但这似乎是一个很好的用例。顺便说一句,如果您想知道为什么要麻烦使用某个函数……那可能是为了避免static initialisation order fiasco。与在命名空间范围内声明的任何内容相比,函数静态的初始化可预测的范围是数百万亿倍。