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

来自cppreference.com
< cpp‎ | utility‎ | optional
 
 
 
 
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 << "已取到:" << 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

[编辑] 参阅

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