std::optional<T>::operator->, std::optional<T>::operator*

来自cppreference.com
< cpp‎ | utility‎ | optional
 
 
 
 
constexprconst T* operator->()constnoexcept;
(1) (C++17 起)
constexpr T* operator->()noexcept;
(2) (C++17 起)
constexprconst T& operator*()const&noexcept;
(3) (C++17 起)
constexpr T& operator*()&noexcept;
(4) (C++17 起)
constexprconst T&& operator*()const&&noexcept;
(5) (C++17 起)
constexpr T&& operator*()&&noexcept;
(6) (C++17 起)

访问所含值。

1,2) 返回指向所含值的指针。
3-6) 返回到所含值的引用。

如果 has_value()false,那么行为未定义。

(C++26 前)

如果 has_value()false,那么:

  • 如果实现是硬化实现,那么就会发生契约违背。并且契约违背处理函数在“观察”求值语义下返回时行为未定义。
  • 如果实现不是硬化实现,那么行为未定义。
(C++26 起)

目录

[编辑]返回值

1,2)val
3,4)*val
5,6)std::move(*val )

[编辑]注解

此运算符不检查 *this 是否含值,用户可以手动用 has_value()operator bool() 做检查。另外,需要有检查访问时可使用 value()value_or()

[编辑]示例

#include <iomanip>#include <iostream>#include <optional>#include <string>   int main(){usingnamespace std::string_literals;   std::optional<int> opt1{1};std::cout<<"opt1:"<<*opt1 <<'\n';   *opt1 =2;std::cout<<"opt1:"<<*opt1 <<'\n';   std::optional<std::string> opt2{"abc"s};std::cout<<"opt2:"<<std::quoted(*opt2)<<",size:"<< opt2->size()<<'\n';   // 你能通过在到 optional 的右值上调用 operator* “取”其所含值auto taken =*std::move(opt2);std::cout<<"已取到:"<<std::quoted(taken)<<"\n""opt2:"<<std::quoted(*opt2)<<",size:"<< opt2->size()<<'\n';}

输出:

opt1:1 opt1:2 opt2:"abc",size:3 已取到:"abc" opt2:"",size:0

[编辑]缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 2762 C++17 operator->operator* 可能为潜在抛出 使之为 noexcept

[编辑]参阅

返回所含值
(公开成员函数)[编辑]
在所含值可用时返回它,否则返回另一个值
(公开成员函数)[编辑]
close