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

来自cppreference.com
< cpp‎ | utility‎ | optional
 
 
工具库
通用工具
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)

初等字符串转换
(C++17)
(C++17)
栈踪
 
std::optional
成员函数
观察器
optional::operator->optional::operator*
(C++17)(C++17)
单子操作
修改器
非成员函数
(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
(C++17)
推导指引
辅助类
(C++17)
(C++17)
(C++17)
辅助对象
(C++17)
(C++17)
 
constexpr const T* operator->() const noexcept;
(1) (C++17 起)
constexpr T* operator->() noexcept;
(1) (C++17 起)
constexpr const T& operator*() const& noexcept;
(2) (C++17 起)
constexpr T& operator*() & noexcept;
(2) (C++17 起)
constexpr const T&& operator*() const&& noexcept;
(2) (C++17 起)
constexpr T&& operator*() && noexcept;
(2) (C++17 起)

访问所含值。

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

*this 不含值则行为未定义。

参数

(无)

返回值

指向所含值的指针或到它的引用。

注解

此运算符不检查 optional 是否含值!你能手动用 has_value() 或简单地用 operator bool() 做检查。另外,若需要有检查访问,可使用 value()value_or()

示例

#include <optional>
#include <iostream>
#include <string>
 
int main()
{
    using namespace 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: " << *opt2 << " size: " << opt2->size() << '\n';
 
    // 你能通过在到 optional 的右值上调用 operator* “取”其所含值
 
    auto taken = *std::move(opt2);
    std::cout << "taken: " << taken << " opt2: " << *opt2 << "size: " << opt2->size()  << '\n';
}

可能的输出:

opt1: 1
opt1: 2
opt2: abc size: 3
taken: abc opt2: size: 0

缺陷报告

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

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

参阅

返回所含值
(公开成员函数)
若所含值可用则返回它,否则返回另一个值
(公开成员函数)