淄博哪家网络公司做网站好,福永网站推广,上海网站制作公司有哪些,上海网站建设百度推广公司哪家好模版类std::optional管理一个可选的(optional)存储值(contained value)#xff0c;即可能存在也可能不存在的值。std::optional的一个常见用例是存储可能失败的函数的返回值。与其它方法相反(例如std::pairT, bool),std::optional可以很好地处理构造成本高昂的对象即可能存在也可能不存在的值。std::optional的一个常见用例是存储可能失败的函数的返回值。与其它方法相反(例如std::pairT, bool),std::optional可以很好地处理构造成本高昂的对象并且更具可读性因为意图被明确表达。 在任何给定时间点的std::optional的任何实例要么存储值要么不存储值。如果std::optional存储一个值则保证该值作为std::optional对象占用空间的一部分进行分配即不会发生动态内存分配。 当std::optionalT类型的对象根据上下文转换为bool时如果该对象存储一个值则转换返回true如果不存储值则转换返回false。 和std::variant、std::any一样std::optional对象有值语义其拷贝操作会被实现为深拷贝。std::optional对象也支持move语义。 std::optional模拟了一个可以为空的任意类型的实例它可以被用作成员、参数、返回值等。 std::optional提供了一种标准化的方式来表示可选值(optional value)消除了对空指针的需要并增强了代码的可读性。std::optional是使用原始指针或其它机制来表示缺失值或可选值的更安全的替代方案。根据设计std::optional强制用户在访问某个值之前显式检查该值是否存在从而最大限度地降低空指针解引用错误的风险。 std::make_optional:创建一个用参数初始化的std::optional对象。 std::nullopt是std::nullopt_t类型的常量用于指示具有未初始化(或空的)状态的std::optional类型作为std::optional对象无值时候的值. std::optional特别适合延迟初始化问题它本身就是延迟初始化的一个实例。所存储的T可以在构造时初始化或者稍后初始化或者从不初始化。
int test_optional_init()
{std::optionalint var;if (!var.has_value())std::cout var is not set\n; // var is not setvar 8; // error: *var 8, 因为var采用默认初始化为空if (var.has_value())std::cout var is present: var.value() \n; // var is present: 8if (var)std::cout var is present: *var \n; // var is present: 8std::optionalint var2{ std::nullopt }; // 将var2初始化置于empty状态if (!var2.has_value())std::cout var2 is not set\n; // var2 is not setstd::optionalstd::string var3{ China };if (var3 std::nullopt)std::cout var3 std::nullopt\n; // var3 std::nulloptauto var4 std::make_optionalstd::vectorchar*({ China, Beijing, Haidian });for (const auto v : *var4)std::cout v; // China Beijing Haidianstd::cout \n;// 内建类型可不需指明存储类型,deduction guidestd::optional var5{ 2 }; std::cout var5: var5.value() \n; // var5: 2std::optional var6{ std::string{China} };std::cout var6: var6.value() \n; // var6: Chinareturn 0;
} std::optional成员函数: 1.访问存储值 (1).var.value():返回引用如果没有值会抛出std::bad_optional_access异常 (2).*var:如果没有值会crash(or undefined behavior)返回存储值的引用应该只用于已经确定含有值的场景 (3).var.value_or返回值注意与value()的区别如果没有值则获取备选值 (4).var-返回存储值的指针可访问内部值的成员 2.emplace:赋予一个新值(in-place)如果在调用之前已经存储一个值则通过调用其析构函数来销毁所存储的值 3.reset:如果存储一个值则销毁该值否则没有任何影响 4.has_value:返回std::optional对象是否存有值 5.operator bool()返回std::optional对象是否存有值 6.swap:交换两个std::optional对象的值 非成员函数比较std::optional对象operator, !, , , , , 。比较std::optional对象时empty值即std::nullopt比任何有值的std::optional对象都要小。 std::bad_optional_access是一个异常类直接派生自std::exception,用于处理在访问std::optional对象时发生的错误当尝试访问一个没有存储值的std::optional对象时会抛出std::bad_optional_access异常。
int test_optional_member_functions()
{// 获取std::optional值: var.value(), *var, var.value_or, var-std::optionalint var{ 8 };std::cout var: var.value() , *var \n; // var: 8, 8*var 6; std::cout var: *var \n; // var: 6var 8; std::cout var: *var \n; // var: 8*var 10; std::cout var: var.value_or(66) \n; // var: 10var.reset(); std::cout var: var.value_or(66) \n; // var: 66std::optionalstd::string var2{ China };std::cout var2: var2-data() \n; // var2: Chinavar.reset(); // or: var {};try {std::cout var: var.value() \n;//std::cout var: *var \n; // 直接crash掉}catch (const std::bad_optional_access e) {std::cout exception: e.what() \n; // var: exception: Bad optional access}std::string str{ Beijing }; // 不要对常量变量使用std::movestd::optionalstd::string var3(std::move(str));std::cout var3: var3.value() , str: str \n; // var3: Beijing, str:var3.emplace(Haidian);std::cout var3: var3.value() \n; // var3: Haidianif (var3.has_value())std::cout var3 has value\n; // var3 has valueif (var3)std::cout var3 has value\n; // var3 has valuestd::cout var2: var2.value() , var3: var3.value() \n; // var2: China, var3: Haidianvar2.swap(var3);std::cout var2: var2.value() , var3: var3.value() \n; // var2: Haidian, var3: Chinaif (var2 ! var3)std::cout var2 ! var3\n; // var2 ! var3return 0;
} 执行结果如下图所示 GitHubhttps://github.com/fengbingchun/Messy_Test