C++ 如何理解语法“Color(&;EnumValuesColor())[3]{…}”?

C++ 如何理解语法“Color(&;EnumValuesColor())[3]{…}”?,c++,syntax,C++,Syntax,这是一个自动生成的头文件(由flatbuffer序列化程序生成),我从未见过像Color(&EnumValuesColor())[3]{…}这样的语法,有人能解释一下吗 枚举颜色{ 颜色\红色=0, 颜色\绿色=1, 颜色\蓝色=2, 颜色\最小=颜色\红色, 颜色\最大值=颜色\蓝色 }; 内联常量颜色(&EnumValuesColor())[3]{ 静态常量颜色值[]={ 红色, 绿色, 蓝色 }; 返回值; } 这是一种老式的写作方式 auto EnumValuesColor() -&g

这是一个自动生成的头文件(由flatbuffer序列化程序生成),我从未见过像
Color(&EnumValuesColor())[3]{…}
这样的语法,有人能解释一下吗

枚举颜色{
颜色\红色=0,
颜色\绿色=1,
颜色\蓝色=2,
颜色\最小=颜色\红色,
颜色\最大值=颜色\蓝色
};
内联常量颜色(&EnumValuesColor())[3]{
静态常量颜色值[]={
红色,
绿色,
蓝色
};
返回值;
}
这是一种老式的写作方式

auto EnumValuesColor() -> Color const (&)[3]

这更清楚地表明,
EnumValuesColor
是一个函数。要读取返回类型,我们从内到外,从右到左读取,返回类型如下:对3个
const Color
对象数组的引用。

不识别它并不奇怪;这是我们从C继承的一些非常神秘的声明者诡计的一个例子,与所谓的“”有关

这里发生的是:

  • 有一个函数名为
    EnumValuesColor
  • 它返回对3个
    const Color
    s数组的引用
  • 它被标记为
    inline
您可以使用来帮助您解析这样的超复杂声明,不过请注意,您必须将
Color
替换为
int
,否则它将不知道您在谈论一个类型:

从C++14开始,您可能更喜欢这样编写函数声明:

inline auto& EnumValuesColor() {
  static const Color values[] = {
    Color_Red,
    Color_Green,
    Color_Blue
  };
  return values;
}
现在,在这样一个小函数中,只要观察我们直接返回一个
const Color values[]
(并将
3
粘贴在其中),我们就可以更容易地看到到底发生了什么。我肯定不是那种推荐“几乎总是自动”的人,但这似乎是一个很好的使用案例

顺便说一句,如果你想知道为什么要费心使用函数……那可能是为了避免这个问题。函数静态的初始化比在命名空间范围内声明的任何函数都要容易预测数百万倍。

另请参见关于解析类型。
inline auto& EnumValuesColor() {
  static const Color values[] = {
    Color_Red,
    Color_Green,
    Color_Blue
  };
  return values;
}