这是一个自动生成的 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的函数
  • 它返回对3个const Color s
  • 数组的引用
  • 标记为inline

  • 您可以使用https://cdecl.org来帮助您解析这样的超复杂声明,但是请注意,您必须将Color替换为int,否则它不会知道您在谈论一种类型:
    c++ - 如何理解 `Color (&EnumValuesColor())[3] {…}`语法?-LMLPHP
    从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。与在命名空间范围内声明的任何内容相比,函数静态的初始化可预测的范围是数百万亿倍。

    10-05 22:02