将静态 constexpr 类成员分配给运行时变量

2023-11-27

我知道有很多类似的问题,但又有些不同的问题。这是关于以下情况:

#include <iostream>
#include <array>

template<typename T> class MyClass
{
public:
    static constexpr std::array<T,4> ARRAY {{4, 3, 1, 5}};
};

int main()
{
    constexpr std::array<int, 4> my_array(MyClass<int>::ARRAY); // works fine -> can use the ARRAY to initialize constexpr std::array

    constexpr int VALUE = 5*MyClass<int>::ARRAY[0]; // works also fine

    int value;
    value = my_array[0]; // can assign from constexpr
    value = MyClass<int>::ARRAY[0]; // undefined reference to `MyClass<int>::ARRAY

    std::cout << VALUE << std::endl;
    std::cout << value << std::endl;

    return 0;
}

据我所理解constexpr用于编译时常量。因此编译器已经可以进行一些计算,例如计算VALUE。我也可以明显地定义一个constexpr std::array<,>,我可以从中将值分配给运行时变量。我希望编译器已经设置value = 4进入可执行程序,以避免加载操作。但是,我无法直接从静态成员分配,出现错误

undefined reference to `MyClass<int>::ARRAY'
clang-3.7: error: linker command failed with exit code 1

这对我来说没有意义,因为它可以通过另一个中间步骤来完成constexpr多变的。

所以我的问题是:为什么类的 static constexpr 成员不能分配给运行时变量?

注意:在我的MWE中,该类是模板类,这不会影响错误。然而,我最初对这个特殊情况感兴趣,我希望它对于非模板类来说更通用。

(编译器是clang++ or g++ with -std=c++11- 他们给出了同样的错误)

编辑:@Bryan Chen:忘记了输出行。现在已添加。


The undefined reference是一个链接器错误。规则是如果一个变量是odr-used那么它必须有一个定义。这甚至适用于constexpr变量。

与大多数 ODR 规则一样,违反它是未定义的行为,不需要诊断(这可以解释为什么您在使用该值时没有看到任何诊断)。

要修复该错误,请在类外部添加定义:

template<typename T> constexpr std::array<T,4> MyClass<T>::ARRAY;

由于它是一个模板,您实际上可以将其放入标头中,而不是通常情况下定义恰好放在一个中.cpp file.


这里的主要问题是是否ARRAY[0]算作odr-use。根据这个详细的帖子,在 C++11 和 C++14 中,索引数组确实算作odr-use,但这被改变了DR 1926针对 C++14 提起诉讼,不odr-use.

However,那就是谈论内置数组。我不知道同样的理由是否适用于std::array,我觉得 [basic.def.odr]/3 的文字很难理解。根据cppreference 的非正式定义, std::array::operator[]会导致odr-use数组的原因是它的返回值绑定了对数组的引用。

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

将静态 constexpr 类成员分配给运行时变量 的相关文章

  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • 条件类型定义

    如果我有一小段这样的代码 template
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository

随机推荐

  • PHP 生成的 csv 文件在 Excel 2007 中显示英镑符号 (£) 的 £

    我使用以下标头命令生成 csv 文件 header Content type text csv charset utf 8 encoding utf 8 header Content Disposition attachment filen
  • 32 位系统上的 Java 10(及更高版本)

    据我所知 oracle 没有计划为 32 位提供 java 但也许我误解了情况 如果我是对的 如果我们需要支持 32 位库 dll 我们该怎么办 那么 32 位操作系统又如何呢 目前这似乎对未来产生巨大影响 但正如我所说 也许我错了 事实上
  • 在 PyQt 中(很好地)显示代数表达式 [重复]

    这个问题在这里已经有答案了 在我的 python 程序中 有一个我创建的数学对象的层次结构 它们代表数学公式 例如 有Collection 这是一系列Equations 这是一个包含两个的容器Sums Products Quotients
  • 设置autoDeploy和deployOnStartup会导致应用程序在启动时部署两次?

    我正在阅读 Damonar Chetty 撰写的 Tomcat 6 开发人员指南 他在主机章节中说道 将两者设置为 true 将导致应用程序在启动时部署 然后在 Tomcat 启动并运行后再次部署 因此 请确保至少将其中一项设置为 fals
  • 在 foreach 循环内部或外部声明变量:哪个更快/更好?

    其中哪一个更快 更好 这个 List
  • 在 Java 中使用 BouncyCastle 通过 ECIES 进行加密

    我正在尝试使用 Java 中的 BouncyCastle 使用 ECC 算法加密一些内容 但我收到 BouncyCastle 库的异常 说无法投射JCEECPublicKey to IESKey 据我了解 生成的公钥KeyPairGener
  • mvc4 项目中的 Intellisense 无法在 vs 2012 professional 中工作?

    在我的剃刀视图中 智能感知不起作用 有解决这个问题的方法吗 我正在使用新发布的 VS 2012 Professional 并构建一个 ASP NET MVC 4 项目 我的剃刀视图中的智能感知不起作用 有什么解决办法吗 对我有帮助的是删除
  • Android - 如何动态更改片段布局

    我有一个平板电脑应用程序 其中包含一个显示我公司数据的 about 片段 我想在页面上时根据屏幕方向动态更改布局 但我还没有找到方法 如果有人找到解决方案 请提前致谢 Yume177 我找到了怎么做 Override public void
  • Git 子模块在 TFS Build 上失败

    当我尝试使用 TFS 和 Git 进行构建时 存在一个限制 即 TFS 的 git 提供程序尚不支持子模块 有点痛苦 但到底是什么 我可以告诉 TFS 在编译之前运行批处理文件 我用它来调用手动 git 脚本来更新我的 超级 项目中的所有子
  • 从 GitHub 操作推送到源

    我正在努力推动origin远程 GitHub 操作 我的行动逻辑是 handle pull request review事件并按评论消息过滤 签出到 master 合并 PR 分支 运行一些检查并将其推送到origin 脚本是 if GIT
  • Phoenix 框架中的动态模型

    有没有办法在Phoenix中动态创建和使用模型 我有一个存储有关客户表的元数据的应用程序 它们设置了一些字段 列名称和类型 然后向我发送 CSV 文件以进行解析和存储 我想根据存储的元数据生成一个模型 以便我可以使用 Ecto 来管理客户端
  • PyUSB 后端无法访问

    嘿 我正在尝试运行教程中提供的简单脚本 USB 正在导入 但是当我尝试搜索设备时出现以下错误 请帮助 gt gt gt dev usb core find Traceback most recent call last File
  • Java套接字的PrintWriter线程安全吗?

    所以 我有两个线程 线程一管理客户端连接 只有一台客户端和一台服务器 我将其称为我的服务器线程 线程二管理向客户端发送消息 我将其称为我的消息处理器线程 线程一负责定期向客户端发送心跳 在编程时 我假设套接字不是线程安全的 但缓冲区是 只要
  • 梯度方向计算

    我正在计算机视觉课程中完成我的任务 子任务之一是基于图像亮度的梯度方向计算 我制作了一个明亮 宽度 高度 矩阵 其中包含图像每个像素的亮度值 我有两个这样的功能 double Image grad x int x int y if x wi
  • 在 C# 中使用动态创建的控件

    我正在创建一个应用程序 用户将在其中输入成绩 程序将输出加权平均值 加载时 它将询问作业的类别数量 然后程序将动态创建文本框供用户输入信息 问题是我无法弄清楚如何读取创建文本框后输入的文本 这是我的代码 TextBox txtbx new
  • 泛型类型推断失败?

    实施例A 研究以下片段 public class ExampleA static class Pair
  • android gridview中的分页[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 android gridview 可以分页吗 如果可用 您可以提供任何链接吗 对于水平分页 请在 ViewPager 中使用 GridView 这是一个教程
  • python Socket服务器与真实IP地址

    我正在使用我的 python 服务器 但我已经不再使用 localhost 我想通过互联网进行访问 到目前为止我的代码是 import socket import threading import socketserver class Th
  • Maven 可以生成 exe 文件和 mac os x 应用程序吗?

    假设您创建了一个小型 Java 桌面应用程序 其中包含一个 jar 和一些依赖项 可能还有一个许可证文本文件 我知道有很多 Ant 任务可以生成安装程序 可执行文件和正确的 Mac OS X 应用程序 包括将它们打包为 dmg 文件 例子是
  • 将静态 constexpr 类成员分配给运行时变量

    我知道有很多类似的问题 但又有些不同的问题 这是关于以下情况 include