为什么使用成员数组而不是常量表达式调用 constexpr 函数?

2024-04-22

我有以下辅助功能:

template<typename T, std::size_t N>
constexpr std::size_t Length(const T(&)[N]) {
    return N;
}

它返回静态数组的长度。在过去,这总是有效的,但是当我这样做时:

struct Foo
{
    unsigned int temp1[3];
    void Bar()
    {
        constexpr std::size_t t = Length(temp1); // Error here
    }
};

使用 MSVS 2017 时出现错误:

error C2131: expression did not evaluate to a constant

note: failure was caused by a read of a variable outside its lifetime

note: see usage of 'this'

我希望有人能够阐明我做错了什么。


MSVC 是正确的。Length(temp1)不是常量表达式。从[expr.const]p2 http://eel.is/c++draft/expr.const#2.1

一种表达e是一个核心常量表达式,除非评估e遵循抽象机的规则,将计算以下表达式之一:

  • this,除了在 constexpr 函数或作为 constexpr 一部分进行计算的 constexpr 构造函数中e;

temp1评估this隐含地(因为你指的是this->temp1),所以你没有常量表达式。 gcc 和 clang 接受它,因为它们支持 VLA 作为扩展(尝试使用-Werror=vla or -pedantic-errors).

为什么不允许这样做?好吧,您可以访问底层元素并可能修改它们。如果你正在处理一个constexpr数组或作为常量表达式求值的数组,但如果不是,则不可能有常量表达式,因为您将操作在运行时设置的值。

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

为什么使用成员数组而不是常量表达式调用 constexpr 函数? 的相关文章

  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 从模板切换传递的类型

    在 C 中是否可以检查传递给模板函数的类型 例如 template
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc

随机推荐

  • 带线程的观察者模式

    我想运行多个线程并将它们加入到主方法的末尾 这样我就可以知道它们何时完成并处理一些信息 我不想将我的线程放入数组中并逐个执行 join 因为 join 是一种阻塞方法 我会留在主线程中等待某些线程仍在运行 而其他线程可能已经完成 没有可能知
  • jquery tablesorter ajax表只按一个方向排序

    我有一个通过 jQuery 加载命令加载的表 在加载函数的回调中 我启动了表排序器插件 由于某种原因 该表仅按降序排序而不是升序排序 更奇怪的是 如果我按住shift 它会在升序和降序之间正确切换吗 知道这是怎么回事吗 表 php tabl
  • 如何在 emacs 中禁用 vc-git?

    我使用 emacs 而不是 sshfs 和 git 存储库 我喜欢使用 git 命令行 因此对于这个项目我不需要启用 vc git 如何防止 vc git 加载 emacs命令 从 vc mode 处理的后端列表中删除 git delete
  • AWS RDS 中 max_connections 的值

    有谁知道我在哪里可以找到 AWS RDS 中 max connections 的最高值 我主要对运行 MySQL 的 db t2 实例感兴趣 我找不到任何合适的链接 谢谢 正如 error2007s 所说 您可以在控制台中找到它 只是为了完
  • 用 O(1) 空间逐行读取数字

    许多编码挑战在同一行中有多个数字 通常第一行告诉多数字行中有多少个数字 4 31 415 9 26 通常我只是读整行 然后 split 并将字符串映射到数字 但有没有好的办法not一次读取整行 而不是一次读取一个数字 为了节省内存 要么因为
  • 实现具有多项选择的项目列表

    在我的 WP8 应用程序中 我想实现一个与标准邮件应用程序中的功能非常相似的功能 用户能够从列表中选择多个项目 我提供了一些屏幕截图来说明此行为 Normal state User taps item s left corner and i
  • 在设备上运行 React Native Android

    我跟着这个官方帮助页面 https facebook github io react native docs running on device android html也咨询了这个上一个SO问题 https stackoverflow c
  • ASP.NET 请求在此上下文中不可用

    当我尝试打开该网站时 我遇到了这个问题 但我不知道出了什么问题 我已经用它编辑了堆栈跟踪 Server Error in Application Request is not available in this context Descri
  • 如何在多个表中使用相同的 REPORT_COUNT 并递增它?

    我正在使用 iReport 5 6 为我的 JavaApp 生成报告 我有三个数据集 如下所示 数据集1查询 SELECT FROM players s WHERE s role 1 数据集2查询 SELECT FROM players s
  • Git 在两个远程之间同步

    我正在使用如下基础设施 我的笔记本电脑 工作站 B 和服务器 B 都在我的工作中 现在为了允许在家工作 我希望能够在工作站 A 上工作 我的笔记本电脑是唯一可以同时连接到两台服务器的设备 因为我在家里设置了 VPN 在当前的项目中 我们正在
  • SQL查找表中第一次出现的数据集

    假设我有一张桌子 CREATE TABLE T TableDTM TIMESTAMP NOT NULL Code INT NOT NULL 我插入一些行 INSERT INTO T TableDTM Code VALUES 2011 01
  • 每次包含同一个文件时都会对其进行标记吗?

    这个问题是关于PHP解析引擎的 当我在单个运行时中多次包含一个文件时 PHP 是否每次都会对其进行标记 或者是否保留缓存并仅在后续包含时运行已编译的代码 EDIT 更多细节 我没有使用外部缓存机制 我正在处理same文件被多次包含在同一个请
  • 如何加载使用 VaryByControl OutputCache 的控件,并指定属性值

    我有一个应该使用缓存的用户控件 其中VaryByControl The ascx文件看起来像这样 p Nothing p The TestControl代码隐藏文件中的类有一个int Test 财产和Page Load 填充的事件处理程序S
  • 线程 1:信号 SIGABRT

    当我为 Xcode 项目运行模拟时出现上述错误 这出现在 O abort with payload 文件中 dyld abort with payload 0x10aae66f8 lt 0 gt movl 0x2000209 eax imm
  • 为什么使用“==”或“is”比较字符串有时会产生不同的结果?

    两个字符串变量设置为相同的值 s1 s2总是返回True but s1 is s2有时返回False 如果我打开 Python 解释器并执行相同的操作is对比一下 成功了 gt gt gt s1 text gt gt gt s2 text
  • Python默认继承?

    如果我在Python中定义一个类 例如 class AClass slots a b c 它继承自哪个类 貌似没有继承object 如果定义一个类并且不声明任何特定的父类 则该类将成为 经典类 其行为与从对象继承的 新式类 略有不同 请参阅
  • 半素数分解的最佳算法是什么?

    半素数分解的最佳算法是什么 它可能与多重保理不同 对半素数进行因式分解的方式与对任何合数进行因式分解的方式相同 使用试除法和 pollard rho 来获得容易实现的目标 如果有的话 然后 p 1 p 1 和椭圆曲线 直到您确信因子太大 用
  • 仅西里尔文输入文本形式

    如何将输入文本限制为仅在 Web 表单文本框中输入Cyrillic人物 首先 您应该对页面和脚本使用支持西里尔字符 例如 UTF 8 的编码 然后 您可以使用正则表达式来检查 input keyup function this value
  • 为什么 ASP.NET DropDownList 控件需要单击两次才能在 Internet Explorer 中展开

    我有一个 ASP NET DropDownList 控件 它呈现到页面上的下拉列表 选择 HTML 标记 中 由于某种原因 当我使用 Internet Explorer 时 需要单击两次才能打开它并查看选项 这对最终用户来说只是额外的单击
  • 为什么使用成员数组而不是常量表达式调用 constexpr 函数?

    我有以下辅助功能 template