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

< cpp‎ | utility‎ | optional

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

### 参阅

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