在编译时初始化静态数组时,g++ (4.7.2) 错误或功能?

2024-06-24

好吧,所以我试图通过初始化一堆来做一些聪明的事情constexpr static int const编译时的数组。尽管运行时性能根本不受初始化这些数组的控制,但这似乎是一个有趣的小练习。我写了一个测试设置来看看是否可行,最终我能够做到这一点:

struct Test
{
    constexpr static int const array[10] = Array<int, 10, 0, Increment>::array;
};

constexpr int const Test::array[10];

int main()
{
    cout << Test::array[3] << '\n';
}

Here, Array有一个名为的静态成员array其中包含 10ints,从 0 开始,其中每个后续元素的值由称为模板元编程函子确定Increment (i.e. {0, 1, ..., 9})。正如预期的那样,程序打印出数字3.

太棒了,对吧?我现在可以编写函子并在编译时初始化各种时髦模式的数组。下一步:通过以下方式对数组大小 10 进行硬编码Test像这样的类模板:

template <size_t Size>
struct Test
{
    constexpr static int const array[Size] = Array<int, Size, 0, Increment>::array;
};

template <size_t Size>
constexpr int const Test<Size>::array[Size];

int main()
{
    cout << Test<10>::array[3] << '\n';
}

然而,突然间它不再编译并显示以下消息:

test.cc:43:72: error: array must be initialized with a brace-enclosed initializer

为什么会发生这种情况?一旦我将类转换为类模板,这种初始化是否会变得无效,或者我是否偶然发现了 GCC 中未实现/有缺陷的东西?

仅供参考,我可以发布我的其余代码(Array例如)根据要求。目前我认为这应该足够了。

EDIT该错误可以通过不同的、简单的实现来重现Array在这里节省一些空间:

template <size_t Size>
struct Array
{
    constexpr static int const array[Size] = {};
};

template <size_t Size>
struct Test
{
    constexpr static int const array[Size] = Array<Size>::array;
};

跟随是非法的;

static const int a[10] = {};
static const int b[10] = a; // Illegal

所以gcc的bug实际上是针对非模板情况的。

您可以使用std::array而不是 C 数组。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在编译时初始化静态数组时,g++ (4.7.2) 错误或功能? 的相关文章

随机推荐

  • 尝试在 PyQt5 中的 pyqtgraph 绘图小部件中获取带有坐标显示的光标

    我正在尝试在 PyQt5 的 pqytplot 图小部件中添加光标位置的读数 我发现这段代码可以实现我想要的功能 但是在一个独立的窗口中 所有这些都在一个程序文件中 import pyqtgraph as pg from pyqtgraph
  • 方法返回类型的类型推断

    当存在显式方法时 为什么 Scala 无法推断方法的返回类型return方法中使用的语句 例如 为什么下面的代码可以编译 object Main def who 5 def main args Array String println wh
  • 带滚动条的控件上的 .NET C# MouseEnter 侦听器

    只要鼠标悬停在特定控件上 我们就会显示某种形式 当鼠标离开控件时 我们会在短暂的超时后隐藏控件 这是标准的悬停行为 但是 当控件 例如树视图 具有滚动条并且鼠标位于滚动条上或上方时 事件不会触发 如果我们可以获得对滚动条控件的引用 这将解决
  • C# 中的单例是什么?

    什么是单例以及何时应该使用它 单例是一种只允许创建其自身实例的类 并且提供对所述实例的简单 轻松的访问 单例前提是整个软件开发的一种模式 有一个C 实现 在 C 中实现单例模式 http csharpindepth com Articles
  • 尝试将焦点设置在隐藏的文本框上

    我试图将焦点集中在隐藏的文本框上 我希望当包含文本框的 body 或 div 加载时 焦点应该位于特定的文本框上 以便该元素捕获来自键盘或任何其他设备的任何输入 我已经尝试过以下代码没有效果
  • C#:抽象策略基类充当策略对象的抽象工厂

    我正在尝试为我的公司创建一个基于网络的工具 本质上是使用地理输入来生成表格结果 目前 三个不同的业务领域使用我的工具并收到三种不同类型的输出 幸运的是 所有的输出都基于相同的主表 子表的思想 它们甚至共享一个公共主表 不幸的是 在每种情况下
  • 无法停止或重新启动 docker 容器

    当尝试停止或重新启动 docker 容器时 我收到以下错误消息 docker restart 5ba0a86f36ea Error response from daemon Cannot restart container 5ba0a86f
  • 如何安装以前版本的 Aptana

    我根本不喜欢3 6版本 它有太多错误 而且与以前的版本相比速度太慢 所以我想安装到以前的版本并等待他们解决问题 我无法降级安装 所以不 不是一个选项 我知道在这个网站上 https wiki appcelerator org display
  • 针对 openpose 将 GCC 9.3.0 降级到 7 后,cuda_compile_1_ generated_batch_norm_layer.cu.o.Release.cmake 出现 CMake 错误

    你知道我该如何解决以下错误吗 这是在我使用以下命令从 GCC 9 3 0 降级到 7 后发生的 使用以前版本的 GCC 我收到此错误 CMake 不支持的 GNU 版本 不支持高于 8 的 gcc 版本 https stackoverflo
  • java中的配置文件

    我创建了一个 Swing 应用程序 GUI 其中包含文本字段 标签 复选框和组合框等字段 当用户输入一些信息时 我希望将文本字段 组合框和复选框的详细信息保存到文件中 并且下次用户打开此窗口时 我希望将已保存在文件中的详细信息 即那些用户上
  • 使用单引号和双引号对 XPath 表达式进行编码

    XPath v1 不包含对表达式进行编码的方法 如果只有单引号或双引号 则可以使用诸如 review name Bob s Pizza review name Pizza Pam 但是如果你两者都有 例如 Fred s Fancy Pizz
  • React NotFoundError:无法在“Node”上执行“insertBefore”:要插入新节点的节点不是该节点的子节点

    当我在 React 中内置的 Aframe 资产管理器中更新新资产时 出现此 notFound 错误 资产管理器组件的构建如下 export class Assets extends PureComponent render const h
  • OS 和 SYS 等容易混淆的 Python 类的命名背后的原因是什么?

    我注意到 SO 中与 Python 相关的大量问题都是关于人们搞乱 Sys 类 操作系统类和无类 例如 一个容易混淆的情况是 os open something open something and sys open something 我
  • 是否可以手动更新 ModelState.IsValid ?

    我想尽可能使用内置的验证功能 我还想对 CRUD 方法使用相同的模型 但是 由于无法使用标准模式完成下拉列表 因此我必须手动验证它 在回发方法中 我只想验证下拉列表并将此结果添加到 ModelState 中 这样我就不必验证使用数据注释完成
  • 如何在 Visual Studio 2022 中的 ASP.NET Core 5 项目上禁用 SSL?

    如何在 Visual Studio 2022 中的 ASP NET Core 5 项目上禁用 SSL 在 Startup cs 中尝试删除 app UseHttpsRedirection 来自家庭控制器内的索引方法 需要https
  • 浏览器何时自动清除外部 JavaScript 文件的缓存?

    我有一个可以随时编辑的 JavaScript 资源 一旦编辑完成 我希望它能够相对较快地传播到用户的浏览器 例如可能 15 分钟左右 但是 编辑此资源的频率很少 可能每月 2 次 我宁愿将资源缓存在浏览器中 因为它将被频繁检索 但我也希望缓
  • 使用Anaconda Distribution,如何使用散景绘图?

    维护者注意 这个问题涉及过时的第一代 Bokeh 服务器 有关现代 Bokeh 服务器应用程序的详细信息 请参阅 https docs bokeh org en latest docs user guide server html http
  • Android 3D按钮文本位置

    如何更改不同按钮状态的文本位置 在图像上您可以看到它现在的样子 drawable
  • 有人有 EPiServer 考试技巧吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我本人和一些同事刚刚被告知我们将于周五参加 EPiServer CMS 认证考试 在网上做了一些研究后 这听起来确实是一项具有挑战性的考试
  • 在编译时初始化静态数组时,g++ (4.7.2) 错误或功能?

    好吧 所以我试图通过初始化一堆来做一些聪明的事情constexpr static int const编译时的数组 尽管运行时性能根本不受初始化这些数组的控制 但这似乎是一个有趣的小练习 我写了一个测试设置来看看是否可行 最终我能够做到这一点