c++ - 如何理解 `Color (&EnumValuesColor())[3] {…}`语法?

标签 c++ syntax

这是一个自动生成的 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,否则它不会知道您在谈论一种类型:
    Screenshot of this problem solved for us by cdecl.org
    从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。与在命名空间范围内声明的任何内容相比,函数静态的初始化可预测的范围是数百万亿倍。

    关于c++ - 如何理解 `Color (&EnumValuesColor())[3] {…}`语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63019383/

    相关文章:

    c++ - 如何从矩阵中取出 Vector3

    c++ - 如果另一个类的构造函数需要参数,我该如何添加一个类成员?

    sql - VBA 运行时错误 3134

    regex - 如何跳过 elisp 中的符号?

    python - 防止类的函数属性将 self 作为第一个参数传递

    .net - 了解 F# 类型构造函数

    c++ - 在 C++ 代码中使用 Windows 的 native 程序打开文件

    c++ - C++中的初始化二维 vector

    c# - 在 .Net 中使用 kernel32

    perl - Gvim 语法高亮