std::optional<T>::operator->, std::optional<T>::operator*
来自cppreference.com
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 |
参阅
返回所含值 (公开成员函数) | |
若所含值可用则返回它,否则返回另一个值 (公开成员函数) |