为什么这个嵌套 lambda 不被视为 constexpr?

2023-11-25

我正在尝试使用嵌套 constexpr lambda 创建一个柯里化接口,但编译器不认为它是常量表达式。

namespace hana = boost::hana;
using namespace hana::literals;

struct C1 {};

template < typename T,
           std::size_t size >
struct Array {};

constexpr auto array_ = [] (auto size) {
      return [=] (auto type) {
        return hana::type_c<Array<typename decltype(type)::type, size()>>;
      };
    };

int main() {

  constexpr auto c1 = hana::type_c<C1>;
  constexpr auto test = hana::type_c<Array<typename decltype(c1)::type, hana::size_c<100>()>>;
  constexpr auto test2 = array_(hana::size_c<100>)(c1);
}

我之前发布了一个问题,因为我发现了一个不同的最小示例,但这还不够。

Error:

test2.cpp: In instantiation of ‘<lambda(auto:1)>::<lambda(auto:2)> [with auto:2 = boost::hana::type_impl<C1>::_; auto:1 = boost::hana::integral_constant<long unsigned int, 100>]’:
test2.cpp:31:54:   required from here
test2.cpp:20:16: error: ‘__closure’ is not a constant expression
         return hana::type_c<Array<typename decltype(type)::type, size()>>;
                ^~~~
test2.cpp:20:16: note: in template argument for type ‘long unsigned int’ 
test2.cpp: In function ‘int main()’:
test2.cpp:31:18: error: ‘constexpr const void test2’ has incomplete type
   constexpr auto test2 = array_(hana::size_c<100>)(c1);

__closure is not a constant expression:如果有人可以向我解释这个错误,那将是一个很大的帮助。我以前遇到过这个错误,但不记得为什么。


我将你的测试用例简化为:

#include <type_traits>

constexpr auto f = [](auto size) {
  return [=](){
    constexpr auto s = size();
    return 1;
  };
};

static_assert(f(std::integral_constant<int, 100>{})(), "");

int main() { }

正如上面评论中所说,发生这种情况是因为size不是函数体内的常量表达式。这并不是 Hana 特有的。作为解决方法,您可以使用

constexpr auto f = [](auto size) {
  return [=](){
    constexpr auto s = decltype(size)::value;
    return 1;
  };
};

或类似的东西。

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

为什么这个嵌套 lambda 不被视为 constexpr? 的相关文章

  • 用 C++ 进行服装建模 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一些软件 最终会绘制一个人体框架 可以配置各种参数 并且计划是在假人身上放置某种衣服 我研究
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi

随机推荐

  • Mac OS Mojave 上的 Ruby 2.4:找不到图像...与 openssl.bundle 相关

    所以我在 Mac OS Mojave 上将 Ruby 升级到了 2 4 9 我在安装 gem 时遇到问题 proj gem install google cloud vision ERROR Loading command install
  • Python - 用于将文本拆分为句子的正则表达式(句子标记化)[重复]

    这个问题在这里已经有答案了 我想从字符串中列出句子 然后将其打印出来 我不想使用 NLTK 来执行此操作 因此 它需要在句子末尾的句点上分割 而不是在小数点或缩写或名称标题上分割 或者如果句子有 com 这是对正则表达式的尝试 但不起作用
  • .NET 验证码 https

    我们已经开始使用 ASP NET recaptcha 控件 它运行良好 但我们的要求之一是所有出站流量都通过 HTTPS 我知道 recaptcha 支持 https 但不清楚在使用 ASP NET 插件选项时如何配置 或者即使它是可配置的
  • Facebook PHP SDK 处理访问令牌

    我已经爬行了很多不同的答案 但我仍然对我应该如何处理 Facebook 感到有点困惑访问令牌 我遇到的主要问题之一是浏览器中存储的信息 例如 我登录应用程序 令牌过期 除非清除浏览器中的 cookie 应用程序设置 否则我无法再次登录 我偶
  • Glassfish 服务器库在 Eclipse Kepler 中不可用?

    我正在使用 Eclipse Kepler 设置一台新的开发机器 以部署在 Glassfish 3 1 2 2 实例上 当我去 project properties gt java build path gt libraries gt add
  • 如何以编程方式安全关闭 Google Chrome

    如何通过 C 安全地关闭 google chrome 我可以终止 chrome 进程 但在这种情况下 Google Chrome 会在下次运行时报告应用程序崩溃 你可以使用鲜为人知的用户界面自动化API 像这样 static void Cl
  • 如何在Powershell中连续读取串行COM端口并偶尔写入COM端口

    我需要知道如何连续从 COM 端口读取数据并使用 Windows Powershell 将其转储到文件中 当我读取数据时 我还需要监视正在读取的数据 并根据读取的最后一行内容将数据写入 COM 端口 要在 Powershell 中打开 CO
  • Java - 如何创建新条目(键,值)

    我想创建类似于的新项目Util Map Entry将包含结构key value 问题是我无法实例化Map Entry因为它是一个接口 有谁知道如何为 Map Entry 创建新的通用键 值对象 There s public static c
  • Ninject 如何在 ASP.NET MVC 中创建控制器?

    这可能是一个愚蠢的问题 但我正在查看 Ninject 源代码 但没有看到 NInject 注册自己的控制器工厂 我也没有看到任何IControllerFactory上课于Ninject Web Mvc集会 我错过了什么吗 Ninject 如
  • 获取强制推送的提交的历史记录

    昨天 我们团队的一名成员做了一个git push force在我们的 Bitbucket 存储库内 我知道是谁 但我想知道是否可以收集哪些提交被强制推送到存储库中 我从 git log history 中寻找的信息是这样的 1951097
  • SkiaSharp 和 GPU 加速

    我正在评估 SkiaSharp 库 来自 nuget 版本 1 59 3 一切都渲染得很好 但 Skia 似乎并没有使用 GPU 来加速渲染 Windows 10 任务管理器未检测到我的测试应用程序对 GPU 的任何使用 我正在使用下一个命
  • 使用 CSS 设置 HTML 标题属性的样式

    我正在尝试设置标题属性的样式
  • KStream 批处理窗口

    我想使用 KStream 接口批量处理消息 我有一个带有键 值的流 我尝试将它们收集在翻滚窗口中 然后我想立即处理整个窗口 builder stream longSerde updateEventSerde CONSUME TOPIC ag
  • jQuery - 使用canvas 在div 之间绘制线条

    我有 n div s 每个都有 h1 标题和 ul 中的项目列表 我想将它们漂浮在画布上并从中绘制线条 div 列出项目 y 至 div 我正在使用 jQuery UI 来制作 div 可拖动 canvas 元素位于页面下方的一部分 一段文
  • 在 Xcode 6 中设置选项卡栏项目选定的图像

    这是我对选项卡栏项目的设置 但是 当单击应用程序内的项目时 不会显示 1051 id badge selected 图像 而是不显示任何内容 我的设置有问题吗 有任何想法吗 为了解决这个问题并在不编写任何代码的情况下设置选定的图像 我们还可
  • Java 应用程序在 Linux 上挂在“java.io.UnixFileSystem.getBooleanAttributes0”处

    我们的客户应用程序似乎挂起并显示以下堆栈跟踪 java lang Thread State RUNNABLE at java io UnixFileSystem getBooleanAttributes0 Native Method at
  • 如何设置轴限制

    我需要帮助设置 matplotlib 上 y 轴的限制 这是我尝试过的代码 但没有成功 import matplotlib pyplot as plt plt figure 1 figsize 8 5 11 plt suptitle plo
  • 将 cookie 加载到 Python 请求会话时出错

    我正在尝试从 selenium 导出的 cookie 将 cookie 加载到 Python 中的请求会话中 但是当我这样做时 它会返回以下错误 list 对象没有属性 extract cookies def load cookies fi
  • 为不同的Linux版本构建内核模块

    我是编写内核模块的新手 因此面临很少的非技术问题 由于为特定内核版本 例如 3 0 0 10 10 是补丁号 创建内核模块需要相同版本的内核头文件 因此看起来直接安装内核头文件并在那里开始开发 但修补内核版本的内核头不可用 因为我有一个来宾
  • 为什么这个嵌套 lambda 不被视为 constexpr?

    我正在尝试使用嵌套 constexpr lambda 创建一个柯里化接口 但编译器不认为它是常量表达式 namespace hana boost hana using namespace hana literals struct C1 te