首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++编译器错误:使用已删除的函数std::variant()

C++编译器错误:使用已删除的函数std::variant()

这个错误是由于在使用std::variant时调用了已删除的函数std::variant()引起的。std::variant是C++17中引入的一个模板类,用于表示多个可能的类型。它的构造函数被删除,意味着不能直接调用std::variant()来创建对象。

解决这个错误的方法是使用std::variant的其他构造函数来创建对象。std::variant提供了多个构造函数,可以接受不同数量和类型的参数来初始化对象。具体使用哪个构造函数取决于你的需求。

以下是一些常见的std::variant构造函数:

  1. std::variant<Types...> var; 创建一个默认构造的std::variant对象var,其中Types是可选的类型列表。
  2. std::variant<Types...> var(value); 使用value初始化std::variant对象var,其中value的类型必须是Types列表中的一个。
  3. std::variant<Types...> var(std::in_place_type_t<T>, Args&&... args); 使用类型T和参数args初始化std::variant对象var。
  4. std::variant<Types...> var(std::in_place_index_t<I>, Args&&... args); 使用索引I和参数args初始化std::variant对象var。

需要注意的是,std::variant对象的类型必须在初始化时确定,因此需要确保传递给构造函数的参数类型与std::variant的类型列表匹配。

对于这个特定的错误,可以尝试使用其他的std::variant构造函数来创建对象,或者检查代码中是否有其他地方调用了已删除的std::variant()构造函数。

腾讯云相关产品和产品介绍链接地址: 腾讯云提供了丰富的云计算产品和服务,包括云服务器、云数据库、云存储等。你可以访问腾讯云官方网站了解更多详情:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

多态实现-虚函数函数指针以及变体

但是,在现在很多编译器中,大多采用是Itanium C++指定mangling标准。...使用函数对象作为访问器 使用函数对象作为访问器,我们需要将variant变量中支持类型都在函数对象中进行实现,即对variant对象支持所有类型operator()重载。...,如果访问器访问一个在函数对象中不支持类型operator()重载时候,会导致编译器错误。...使用泛型lambda作为访问器 最简单使用访问器方式是使用泛型lambda,它是一个可以处理任意类型函数对象,如下代码所示: int main() { std::variant<int, std...特点 在前面的内容中,我们讲了使用函数以及variant来实现多态方案,既然二者都能实现多态,那么我们什么时候使用函数什么时候使用variant呢?

89120

C++多态性能测试:CRTP vs std::variant vs virtual

C++多态性能测试:CRTP vs std::variant vs virtual 多态是面向对象编程一个重要概念,它使得单一接口能够代表不同类型。...C++提供了几种实现多态性方式,本文将会讨论三种场景多态: 虚函数:在C++中实现多态性传统方式是使用函数。这涉及使用基类和派生类来实现特定实现。...std::variant:在C++17中引入std::variant,它实现了一种无需继承多态性。...测试组合场景如下: 单纯crtp crtp + std::variant virtual std::variant + std::visit std::variant + std::get_if std...::variant + std::holds_alternative 使用编译器: gcc 13.2 clang17.0 完整测试代码放置星球,这里贴一下关键代码(见文末)。

19610

C++17 在业务代码中最好用十个特性

通过使用std::variant,用户可以实现类似 Rust std::result,即在函数执行成功时返回结果,在失败时返回错误信息,上文例子则可以改成: std::variant...return {ret}; } 需要注意是,c++17 只提供了一个库级别的 variant 实现,没有对应模式匹配(Pattern Matching)机制,而最接近std::visit又缺少编译器优化支持...,所以在 c++17 中std::variant并不好用,跟 Rust 和函数式语言中出神入化 Sum Type 还相去甚远,但是已经有许多围绕std::variant提案被提交给 c++委员会探讨...总结一下,c++17 新增三种类型给 c++带来了更现代更安全类型系统,它们对应使用场景是: std::any适用于之前使用void*作为通用类型场景。...std::optional适用于之前使用nullptr代表失败状态场景。 std::variant适用于之前使用union场景。

2.4K20

c++17好用新特性总结

有兴趣朋友可以看看下面两篇文章: 《c++ inline variable 内联变量 c++17》 《GCC,Clang 在C模式,较低优化等级下,链接器对内联函数报未定义错误,为什么?》...通过使用std::variant,用户可以实现类似Ruststd::result,即在函数执行成功时返回结果,在失败时返回错误信息,上文例子则可以改成。...需要注意是,c++17只提供了一个库级别的variant实现,没有对应模式匹配(Pattern Matching)机制,而最接近std::visit又缺少编译器优化支持,所以在c++17中std...::variant并不好用,跟Rust和函数式语言中出神入化Sum Type还相去甚远,但是已经有许多围绕std::variant提案被提交给c++委员会探讨,包括模式匹配,std::expected...std::optional适用于之前使用nullptr代表失败状态场景。 std::variant适用于之前使用union场景。

2.9K10

C++ 中文周刊 第70期

请提交 issue 2022 07 11 资讯 标准委员会动态/ide/编译器信息放在这里 编译器信息最新动态推荐关注hellogcc公众号 本周更新 2022-07-06 第157期 文章 c++ tip...,分析不出这个函数是否是noreturn行为。...可以给这个函数标记noreturn RISC-V linker relaxation in lld 做编译器,介绍他这个功能背景和实现 Under what conditions can I modify...右值生命周期被意外延长了,使用 clang-Wdangling-gsl帮你查 视频 cppnow视频开始放流了。...不过不是线程安全。玩具。看个乐 工作招聘 有没有需要看大门 ---- 看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你评论非常重要!也可以帮忙点赞收藏转发!多谢支持!

59090

C++ 中文周刊 第72期

:string s(nullptr); //不会挂了 basic_string::resize_and_overwrite() 可以省一个写,用不上可以先用gcc内置函数 std::string s...0; } Upside Down Polymorphic Inheritance Leveraging P2162 for Fun & Profit p2162继承variant各个编译器已经支持了。...视频 C++ Weekly - Ep 334 - How to Put a Lambda in a Container 通过函数make_lambda返回一个lambda,然后推导这个lambda类型...直接用lambda不行,类型信息是匿名,无法使用。 或者用std::function不就行了?...看个乐 工作招聘 有没有需要招扫地僧式保洁。我会拖地 ---- 看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你评论非常重要!也可以帮忙点赞收藏转发!多谢支持!

29020

看完这 7 条,模拟 C++ 新功能只是一个小目标!

有一些方法可以使用代码中新功能思路,更准确地传达你意图。 当然,这些方法肯定不如使用新版本C++本身功能那么好,这就是你还是需要更新编译器原因。...1 = default, = delete 在C++ 11中,= default可以向编译器发出指令生成以下内容之一: • 一个默认构造函数; • 一个拷贝构造函数; • 一个拷贝赋值运算符; •...在某些情况下,编译器无论如何都会生成这些函数。但是对于C++ 11,一些开发人员喜欢在他们界面中表现这一点,以向读者保证他们知道这些方法是自动生成,并且这也是他们想要类。...传递没有这些特定操作类型将会造成编译错误,并产生明确错误消息,以解释为什么该类型不是预期Iterator。 我不打算想你介绍如何在C++语言引入这些之前,自行模拟概念。...比如std::optional,或std::variant,这两者出现在C++ 17中。如果你没有C++ 17,那么想要编写自己实现并可靠地替换标准库接口并通过完整测试,并不是件容易事情。

65510

周末学了点 Rust简介工具链宏(macros)返回值和错误处理Ownership 和生命周期闭包小结参考文档

其中,最重要是 cargo 这个包管理工具,rustc 编译器使用,大部分也是通过 cargo 来调用。...(C++ 中复杂宏,估计过几个月,原作者都不敢随便改动了…直接字符串替换,在不确定用户使用场景时候,非常容易出问题。) Rust 中宏功能强大、严谨很多。...不同是,Go 通过多个函数返回值来返回数据+错误信息,Rust 则搞了一个一开始看起来比较奇怪返回值 —— Result。...,有点繁琐… 可能是 c++ 写多了,个人还是比较习惯 Go 那种多个返回值错误处理方式,虽然 C++ 不支持多个返回值。...Operator 有时候,我们写一个函数,只想把更底层错误直接传递给上一层。

90820

C++】泛型编程 ⑧ ( 类模板继承语法 | 普通类 继承 类模板语法 | 类模板 继承 类模板语法 | 继承类模板必须指定具体类型参数列表 | 继承 类模板 必须重写构造函数 )

, 将具体数据类型固定下来 , C++ 编译器 才能知道 父类 所占 内存大小 , 才能正确分配内存 ; 否则 , 会报 " error C2955: “Father”: 使用 类 模板 需要 模板...参数列表 " 错误 ; 报错信息如下 : 启动生成… 1>------ 启动生成: 项目: HelloWorld, 配置: Debug Win32 ------ 1>Test.cpp 1>D:..., 声明 子类实例对象 , Son son; 会报错 error C2280: “Son::Son(void)”: 尝试引用删除函数 ; 启动生成… 1>------ 启动生成: 项目:...002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Test.cpp(26): error C2280: “Son::Son(void)”: 尝试引用删除函数...默认构造函数 或重载解决不明确,因此隐式删除函数 1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Test.cpp(19): message

53030

C++核心准则ES.48:避免使用类型转换

最好结果是依赖编译器实现。...写出类型转换代码程序员通常以为知道自己在做什么,或者类型转换可以让代码更容易理解。实际上,它们经常忽视使用一般准则。重载和模板例示通常可以选择正确函数,只要这个函数存在。...类型转换在系统级编程中是必要。例如,不然我们怎么获得登录到指针中派生类类型设备?然而,类型转换已经被严重地过度使用,从而变成了错误主要来源之一。...如果你调用了一个带有[[nodiscard]]返回值函数,而且你就是希望放弃处理该结果,首先考虑一下这是否是一个好主意(通常函数作者或者当初使用[[nodiscard]]返回值类型都有很好理由),...现代C++包含很多场景下消除类型转换原则和构造,例如 Use templates 使用模板 Use std::variant 使用std::variant Rely on the well-defined

61020

现代C++教程:高速上手(四)-容器

1、线性容器 std::array与std::vector不同是,array对象大小是固定,如果容器大小是固定,那么可以优先考虑使用std::array容器。...由于std::vector是自动扩容,当存入大量数据后,并且对容器进行了删除操作,容器并不会自动归还被删除元素相应内存,这时候需要手动运行shrink_to_fit()释放这部分内存。...2、无序容器 传统c++有序容器 std::map / std::set,这些元素内部通过红黑树进行实现,插入和搜索平均复杂度均为O(log(size))。...元组基本操作 三个核心函数: 1、std::make_tuple: 构造元组 2、std::get:获得元组某个位置值 3、std::tie:元组拆包 #include #...:endl; //非法,引发编译期错误 std::cout (t) << std::endl; 运行期索引 std::get依赖一个编译期常量,所以下面的方式是不合法

83420

一文入魂:妈妈再也不用担心我不懂C++移动语义了!

(一)deleted functions 在细说移动构造函数和移动赋值运算符生成规则之前,我们先要说一说“删除函数(deleted functions)”。...在C++11中,可以使用语法=delete;来将函数定义为“删除”。...任何使用删除函数代码都会产生编译错误: class MyClass{public: void Test() = delete;}; MyClass value;value.Test...to reference a deleted function 通过编译器报错信息我们可以推断,如果我们定义了移动构造函数,那么移动赋值运算符会被编译器定义为“删除函数”,反之,如果我们定义了移动赋值运算符...,那么移动构造函数也会被编译器定义为“删除函数”。

98220
领券