具有在编译时评估的向量的构建器模式(使用“consteval”)

2024-01-14

我正在尝试创建一个遵循构建器模式并且在编译时完全运行的类(使用新的constevalC++20 中的关键字),但无论我尝试什么都不起作用。例如,这是行不通的:

#include <vector>

class MyClass
{
private:
    std::vector<int> data;

public:
    consteval MyClass& setData()
    {
        this->data = {20};
        return *this;
    }

    consteval std::vector<int> build()
    {
        return data;
    }
};


int main()
{
    std::vector<int> data = MyClass().setData().build();
}

这给出了错误“<anonymous>不是常量表达式”。这让我相信我应该返回类的副本:

#include <vector>

class MyClass
{
private:
    std::vector<int> data;

public:
    consteval MyClass setData()
    {
        // https://herbsutter.com/2013/04/05/complex-initialization-for-a-const-variable/
        return [&]{
            MyClass newClass;
            newClass.data = {20};
            return newClass;
        }();
    }

    consteval std::vector<int> build()
    {
        return data;
    }
};


int main()
{
    std::vector<int> data = MyClass().setData().build();
}

然而,我遇到了同样的错误。我应该如何在 C++ 中使用常量时间构建器模式?看来这只发生在vectors,我使用的是支持C++20的版本constexpr vectors.


您的代码无法编译,因为当前的 C++ 只允许在常量表达式中进行“瞬态”分配。这意味着在常量表达式求值期间,允许动态分配内存 (C++20 起),但前提是任何此类分配在常量表达式“结束”时都已释放。

在您的代码中,表达式MyClass().setData()必须是常量表达式,因为它是立即调用(这意味着调用consteval函数,而不是发生在另一个函数内部的函数consteval函数或内部if consteval堵塞)。表达方式MyClass().setData().build()也必须是常量表达式。这意味着,虽然MyClass().setData().build()正在评估中,允许动态分配,但在评估结束时不得有“幸存”分配MyClass().setData()也不在结束时MyClass().setData().build().

既然没有办法阻止这样的结果MyClass().setData()由于具有实时分配,您只能在封闭的内部调用它consteval函数或if consteval堵塞。例如,以下内容将是有效的:

consteval int foo() {
    return MyClass().setData().build()[0];
}

请注意,临时MyClass对象(因此std::vector<int>子对象)将被销毁,因此所有动态分配都将在之前被清理foo()返回。

你想将向量保留在最外层之后consteval功能完成?抱歉,您不能这样做——至少在当前版本的 C++ 中不能。您需要将其内容复制到std::array或其他一些不使用动态分配的对象。

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

具有在编译时评估的向量的构建器模式(使用“consteval”) 的相关文章

  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 使用 mono/nunit-console/4 在 Mac OS X 控制台上运行测试

    我安装了 Max OS X 10 11 1 上面装有 Xamarin 我编写了简单的测试类 只是为了测试在 Mac OS X 和 Ubuntu 上运行 Nunit 测试 该类实际上有一个返回字符串的方法 using System names
  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959

随机推荐

  • 如何显示小时范围

    我有一个数据库表 以 TIME 格式存储餐厅的营业时间作为时间范围 例如 如果餐厅的营业时间是 上午 9 点至下午 5 点 则会有 2 列 hours open 和 hours close 我将 9 00 存储在 hours open 中
  • 如何查看文本通道的权限值? [不和谐.py]

    我想检查文本通道是否已将权限设置为特定值 特别是发送信息允许 基本上我想要这样的东西 bot command async def perm ctx channel discord TextChannel None if send messa
  • 如何获取视图中的列级依赖关系

    我已经对这个问题进行了一些研究 但还没有解决方案 我想要得到的是视图中的列级依赖关系 所以 假设我们有一张这样的表 create table TEST first name varchar 10 last name varchar 10 s
  • 滚动时图像变化

    继另一个那么问题 https stackoverflow com questions 15861645 change image on scroll 该脚本更改页面滚动上的图像 然而 如果该脚本用于包含 200 多个图像的视频帧 则该脚本将
  • 配置 redis 以一致地首先逐出旧数据

    我在 redis 中存储了一堆实时数据 我将所有按键的 TTL 设置为 14400 秒 4 小时 我已将 maxmemory 设置为 10G 目前内存中的空间不足以容纳 4 小时的数据 而且我没有使用虚拟内存 因此 Redis 会在数据过期
  • 如何计算每个id的总和

    使用水晶报表7 我想查看表1和表2的总和 table1 id name 001 raja 002 vijay 003 suresh table2 id value 001 100 001 200 001 150 002 200 003 15
  • 使用画布(三.js)覆盖画布(WebGL)

    我有两块画布 第一个应该是背景 其内容通过原始 WebGL 3D 渲染 第二个画布应该覆盖第一个画布 并且主要是透明的 它的内容通过 Three js 3D 内容 呈现 不幸的是 第二个画布不是绘制在第一个画布的上面 而是绘制在它的旁边 如
  • 如何使用 swiftUI 创建平滑的颜色变化动画? (有问题的例子)

    I have a play pause button that changes when pressed At the moment it just fades in and out but I would like it to perfo
  • C# 将 Lambda 表达式函数转换为描述性字符串

    我有一个完全不必要的困境 我正在懒洋洋地寻找一个将 lamda 表达式转换为字符串的函数 让我烦恼的是 我每次都输入这个缓存键 但我真的不想花时间创建它 我想将它用于我创建的缓存函数 如果我想获取一个人的名字而不是每次都调用该函数 那么在哪
  • 直观地看 For 循环中 fork() 会发生什么

    我一直在试图理解fork http en wikipedia org wiki Fork system call 行为 这次在一个for loop 观察以下代码 include
  • 对于 Swing 应用程序,通过 JNA 调用 GetOpenFileName 失败

    我正在尝试使用 Java 中的本机 Windows 文件对话框 使用 JNA 调用 comdlg32 函数GetOpenFileName 我做了一个静态方法 OpenFileDialog display看起来像这样 public stati
  • Prolog 中的简单图搜索

    我正在尝试在 SWI Prolog 中编写一个简单的图形搜索代码 我想出了以下程序 adjacent 1 4 adjacent 4 2 adjacent 3 6 adjacent 6 4 adjacent 7 10 adjacent 4 9
  • 如何正确地与反应形式进行双向绑定?

    到目前为止 我一直认为你不应该混合使用 ngModel 与反应形式 而不是简单地使用formControlName 然而 对我来说 这似乎不起作用 我有一个表单并向其中添加控件 this exportForm addControl surc
  • 如果字段为空,则通过 jQuery 禁用发送按钮

    如果有一个或多个输入字段为空 如何禁用发送按钮 我在伪代码中的尝试 if input empty input disabled else enable the ask question button 我一直在阅读这些文章但没有找到正确的解决
  • 在 Swift 中包含 C++ 头文件

    我有一个 C 头文件 名为header h 我想将其包含到我的 Swift 项目中 由于我想要包含的 C 框架尚未完成 所以我现在只有头文件 我的 C 头文件header h看起来有点像这样 include
  • 在两个 tomcat 服务器上的两个应用程序之间保持 JSP 会话处于活动状态

    您好 我想在 2 个 tomcat 服务器上运行的两个不同应用程序之间保持相同的会话 我在一台服务器上运行一个应用程序 在登录时为其创建一个会话 如果我单击应用程序上的链接 它将被重定向到另一个 tomcat 服务器上的第二个应用程序 此时
  • Bootstrap:模态上的弹出窗口

    我想使用 Twitter 的 Bootstrap CSS 库在现有模态对话框上使用弹出窗口效果 我将弹出框绑定到小图像图标 infoIcon popover offset 50 placement right 模态本身也是根据文档添加的 m
  • Python 列表中的 Numpy.Array?

    我有一个 numpy 数组列表 用作堆栈 现在我想检查数组是否已在列表中 例如 如果它是元组 我会简单地写一些相当于 1 1 in 1 1 2 2 然而 这不适用于 numpy 数组 np array 1 1 in np array 1 1
  • 将元数据添加到 Stripe 客户对象

    我正在使用 Stripe 设置支付系统 我想向客户对象添加一些元数据 我想将我的工作区 ID 添加到客户的元数据属性中 我尝试了下面的代码 但它返回以下错误 Error Error Invalid val bsontype gt Objec
  • 具有在编译时评估的向量的构建器模式(使用“consteval”)

    我正在尝试创建一个遵循构建器模式并且在编译时完全运行的类 使用新的constevalC 20 中的关键字 但无论我尝试什么都不起作用 例如 这是行不通的 include