Namespaces
Variants

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

来自 zh.cppreference.net
 
 
 
 
constexpr const T* operator->() const noexcept;
(1) (C++17 起)
constexpr T* operator->() noexcept;
(2) (C++17 起)
constexpr const T& operator*() const& noexcept;
(3) (C++17 起)
constexpr T& operator*() & noexcept;
(4) (C++17 起)
constexpr const 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()
{
    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: " << std::quoted(*opt2) << ", size: " << opt2->size() << '\n';
    // 通过对右值 optional 调用 operator* 来“获取”所含的值
    auto taken = *std::move(opt2);
    std::cout << "taken: " << std::quoted(taken) << "\n"
                 "opt2: " << std::quoted(*opt2) << ", size: " << opt2->size() << '\n';
}

输出:

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

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 适用范围 发布时行为 正确行为
LWG 2762 C++17 operator-> 和 operator* 可能抛出异常 设为 noexcept

另见

返回所包含的值
(公开成员函数)
返回所包含的值(如果可用),否则返回另一个值
(公开成员函数)