为什么使用成员数组而不是常量表达式调用 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 函数? 的相关文章

  • 我应该把 try/catch 和“using”语句放在哪里? [复制]

    这个问题在这里已经有答案了 可能的重复 try catch using 正确的语法 https stackoverflow com questions 4590490 try catch using right syntax 我想try c
  • JSON.Net 反序列化返回“null”

    我正在使用 JSON Net 反序列化 JSON 字符串 JSON 字符串是 string testJson Fruits Apple color red size round Orange Pro
  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • IEnumerable 的 String.Join(string, string[]) 的类似物

    class String包含非常有用的方法 String Join string string 它从数组创建一个字符串 用给定的符号分隔数组的每个元素 但一般来说 它不会在最后一个元素之后添加分隔符 我将它用于 ASP NET 编码 以用
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • 如何以编程方式播放 16 位 pcm 数组 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含 16 位 pcm 值的短 数组 我希望能够在不添加任何标题 也不将任何文件保存到内存的情况下播放它 我知道我可能需要一个提供
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • 带有运算符语法的错误消息,但不带有函数语法的错误消息

    为什么我在调用 unary 时收到错误消息 使用运算符语法 如果我用函数语法调用它就可以了 现场演示 https godbolt org z j7AbeQ template
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho

随机推荐

  • 带线程的观察者模式

    我想运行多个线程并将它们加入到主方法的末尾 这样我就可以知道它们何时完成并处理一些信息 我不想将我的线程放入数组中并逐个执行 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