Namespaces
Variants

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

From cppreference.net
Utilities library
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

参见

返回所含值
(公开成员函数)
若存在则返回所含值,否则返回另一值
(公开成员函数)