水果网站策划方案汝城县网站建设公司

张小明 2026/1/10 12:23:01
水果网站策划方案,汝城县网站建设公司,做网站直播平台,如何用云服务器建设网站一、背景C 代码似乎经常出现一个问题#xff1a;如果该值可以来自左值或右值#xff0c;则对象如何跟踪该值#xff1f;即如果保留该值作为引用#xff0c;那么就无法绑定到临时对象。如果将其保留为一个值#xff0c;那么当它从左值初始化时#xff0c;会产生不必要的副…一、背景C 代码似乎经常出现一个问题如果该值可以来自左值或右值则对象如何跟踪该值即如果保留该值作为引用那么就无法绑定到临时对象。如果将其保留为一个值那么当它从左值初始化时会产生不必要的副本。有几种方法可以应对这种情况。使用std::variant提供了一个很好的折衷方案来获得有表现力的代码。二、跟踪值假设有一个类MyClass。想让MyClass访问某个std::string。如何表示MyClass内部的字符串有两种选择将其存储为引用。将其存储为副本。2.1、存储引用如果将其存储为引用例如const引用展开代码语言C自动换行AI代码解释class MyClass { public: explicit MyClass(std::string const s) : s_(s) {} void print() const { std::cout s_ \n; } private: std::string const s_; };则可以用一个左值初始化我们的引用代码语言C自动换行AI代码解释std::string s hello; MyClass myObject{s}; myObject.print();看起来很不错。但是如果想用右值初始化我们的对象呢例如代码语言C自动换行AI代码解释MyClass myObject{std::string{hello}}; myObject.print();或者这样的代码代码语言C自动换行AI代码解释std::string getString(); // function declaration returning by value MyClass myObject{getString()}; myObject.print();那么代码具有未定义的行为。原因是临时字符串对象在创建它的同一条语句中被销毁。当调用print时字符串已经被破坏使用它是非法的并导致未定义的行为。为了说明这一点如果将std::string替换为类型X并且在X的析构函数打印日志展开代码语言C自动换行AI代码解释struct X { ~X() { std::cout X destroyed \n;} }; class MyClass { public: explicit MyClass(X const x) : x_(x) {} void print() const { // using x_; } private: X const x_; };在调用的地方也打印日志代码语言C自动换行AI代码解释MyClass myObject(X{}); std::cout before print \n; myObject.print();输出代码语言Bash自动换行AI代码解释X destroyed before print可以看到在尝试使用之前这个X已经被破坏了。完整示例展开代码语言C自动换行AI代码解释#include iostream #include string struct X { ~X() { std::cout X destroyed \n;} }; class MyClass { public: explicit MyClass(X const x) : x_(x) {} void print() { (void) x_; // using x_; } private: X const x_; }; int main() { MyClass myObject(X{}); std::cout before print \n; myObject.print(); }2.2、存储值另一种选择是存储一个值。这允许使用move语义将传入的临时值移动到存储值中展开代码语言C自动换行AI代码解释class MyClass { public: explicit MyClass(std::string s) : s_(std::move(s)) {} void print() const { std::cout s_ \n; } private: std::string s_; };现在调用它代码语言C自动换行AI代码解释MyClass myObject{std::string{hello}}; myObject.print();产生两次移动(一次构造s一次构造s_)并且没有未定义的行为。实际上即使临时对象被销毁print也会使用类内部的实例。不幸的是如果带着左值返回到第一个调用点代码语言C自动换行AI代码解释std::string s hello; MyClass myObject{s}; myObject.print();那么就不再做两次移动了做了一次复制(构造s)和一次移动(构造s_)。更重要的是我们的目的是给MyClass访问字符串的权限如果做一个拷贝就有了一个不同于进来的实例。所以它们不会同步。对于临时对象来说这不是问题因为它无论如何都会被销毁并且我们在之前将它移了进来所以仍然可以访问字符串。但是通过复制我们不再给MyClass访问传入字符串的权限。所以存储一个值也不是一个好的解决方案。三、存储variant存储引用不是一个好的解决方案存储值也不是一个好的解决方案。我们想做的是如果引用是从左值初始化的则存储引用如果引用是从右值初始化的则存储引用。但是数据成员只能是一种类型值或引用对吗?但是对于std::variant它可以是任意一个。不过如果尝试在一个变量中存储引用就像这样代码语言C自动换行AI代码解释std::variantstd::string, std::string const将得到一个编译错误代码语言C自动换行AI代码解释variant must have no reference alternative为了达到我们的目的需要将引用放在另一个类型中即必须编写特定的代码来处理数据成员。如果为std::string编写这样的代码则不能将其用于其他类型。在这一点上最好以通用的方式编写代码。四、通用存储类存储需要是一个值或一个引用。既然现在是为通用目的编写这段代码那么也可以允许非const引用。由于变量不能直接保存引用那么可以将它们存储到包装器中:展开代码语言C自动换行AI代码解释templatetypename T struct NonConstReference { T value_; explicit NonConstReference(T value) : value_(value){}; }; templatetypename T struct ConstReference { T const value_; explicit ConstReference(T const value) : value_(value){}; }; templatetypename T struct Value { T value_; explicit Value(T value) : value_(std::move(value)) {} };将存储定义为这两种情况之一代码语言C自动换行AI代码解释templatetypename T using Storage std::variantValueT, ConstReferenceT, NonConstReferenceT;现在需要通过提供引用来访问变量的底层值。创建了两种类型的访问:一种是const另一种是非const。4.1、定义const访问要定义const访问需要使变量内部的三种可能类型中的每一种都产生一个const引用。为了访问变量中的数据将使用std::visit和规范的overload模式这可以在c 17中实现代码语言C自动换行AI代码解释templatetypename... Functions struct overload : Functions... { using Functions::operator()...; overload(Functions... functions) : Functions(functions)... {} };要获得const引用只需为每种variant创建一个展开代码语言C自动换行AI代码解释templatetypename T T const getConstReference(StorageT const storage) { return std::visit( overload( [](ValueT const value) - T const { return value.value_; }, [](NonConstReferenceT const value) - T const { return value.value_; }, [](ConstReferenceT const value) - T const { return value.value_; } ), storage ); }4.2、定义非const访问非const引用的创建使用相同的技术除了variant是ConstReference之外它不能产生非const引用。然而当std::visit访问一个变量时必须为它的每一个可能的类型编写代码展开代码语言C自动换行AI代码解释templatetypename T T getReference(StorageT storage) { return std::visit( overload( [](ValueT value) - T { return value.value_; }, [](NonConstReferenceT value) - T { return value.value_; }, [](ConstReferenceT ) - T. { /* code handling the error! */ } ), storage ); }进一步优化抛出一个异常展开代码语言C自动换行AI代码解释struct NonConstReferenceFromReference : public std::runtime_error { explicit NonConstReferenceFromReference(std::string const what) : std::runtime_error{what} {} }; templatetypename T T getReference(StorageT storage) { return std::visit( overload( [](ValueT value) - T { return value.value_; }, [](NonConstReferenceT value) - T { return value.value_; }, [](ConstReferenceT ) - T { throw NonConstReferenceFromReference{Cannot get a non const reference from a const reference} ; } ), storage ); }五、创建存储已经定义了存储类可以在示例中使用它来访问传入的std::string而不管它的值类别:展开代码语言C自动换行AI代码解释class MyClass { public: explicit MyClass(std::string value) : storage_(NonConstReference(value)){} explicit MyClass(std::string const value) : storage_(ConstReference(value)){} explicit MyClass(std::string value) : storage_(Value(std::move(value))){} void print() const { std::cout getConstReference(storage_) \n; } private: Storagestd::string storage_; };1调用时带左值代码语言C自动换行AI代码解释std::string s hello; MyClass myObject{s}; myObject.print();匹配第一个构造函数并在存储成员内部创建一个NonConstReference。当print函数调用getConstReference时非const引用被转换为const引用。2使用临时值代码语言C自动换行AI代码解释MyClass myObject{std::string{hello}}; myObject.print();这个函数匹配第三个构造函数并将值移动到存储中。getConstReference然后将该值的const引用返回给print函数。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

仪征建设银行官方网站域名和网址

在国产化与云原生技术交相辉映的今天,选择合适的制品管理工具对于提升研发效能至关重要。在众多的国产开源选择中,Harbor 与 Hadess 是两款功能完善简洁易用的开源制品管理工具。这篇文章将为大家进行一个较为详细的对比,以给大家在工具选择上…

张小明 2026/1/5 22:35:12 网站建设

做网站一般字号要做多少营销系统软件

ReadCat开源小说阅读器终极使用指南:打造你的专属数字书房 【免费下载链接】read-cat 一款免费、开源、简洁、纯净、无广告的小说阅读器 项目地址: https://gitcode.com/gh_mirrors/re/read-cat 在信息爆炸的时代,你是否渴望一个纯粹、专注的阅读…

张小明 2026/1/5 22:35:13 网站建设

设计名字的网站五合一自助建站网站

1蓝牙基础知识 1.1蓝牙概述 蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技术,能在包括移动电话、PDAQ、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换,蓝牙工作在全球通用的2.4 GHz(2.4 至 2.485 G…

张小明 2026/1/5 22:35:15 网站建设

明年做哪个网站致富page和wordpress

MATLAB进行改进的rrt路径规划算法(概率采样策略贪心算法3次B样条优化),代码与实现。 项目亲测可以完美运行 三维二维取其一。 可根据自己的想法任意设置起点与终点和障碍物。 地图可更改,可自行设置多种尺寸地图进行对比&#xff…

张小明 2026/1/5 22:35:16 网站建设

邢台做网站备案广告策划书撰写

科研新人做综述时最痛苦:一搜就是几十页论文,重复、无关、没用。下面三款工具让我效率翻倍。 ① WisPaper(智能学术搜索 文献管理) 官网:https://www.wispaper.ai WisPaper 能通过关键词和语义搜索快速找到相关文献&…

张小明 2026/1/5 22:35:16 网站建设

兰州网站建设公司有哪些四川建站

在企业数字化不断深化的背景下,低代码被广泛视为提升交付效率的可行方案。但其真正价值并不取决于表层的可视化界面,而在于可视化工作流、数据模型、逻辑引擎与系统架构能力所构成的技术内核。对这些机制的深入理解,有助于判断低代码在扩展性…

张小明 2026/1/5 22:35:17 网站建设