std::common_iterator<I,S>::operator*,->
來自 cppreference.com
< cpp | 迭代器 | common_iterator
constexpr decltype(auto) operator*(); |
(1) | (C++20 起) |
constexpr decltype(auto) operator*() const requires /*可解引用*/<const I>; |
(2) | (C++20 起) |
constexpr auto operator->() const requires /* 見描述 */; |
(3) | (C++20 起) |
輔助型別 |
||
class /*代理*/ { std::iter_value_t<I> keep_; |
(4) | (僅作說明*) |
返回指向當前元素的指標或引用,或持有它的代理。
如果底層 std::variant 成員物件 var
不持有型別 I
的物件,即 std::holds_alternative<I>(var) 等於 false,則行為未定義。
令 it
表示 var
中持有的型別 I
的迭代器,即 std::get<I>(var)。
1,2) 返回解引用
it
的結果。3) 返回指向當前元素的指標或底層迭代器,或持有它的代理。
- 如果
I
是指標型別或表示式 it.operator->() 格式良好,則等價於 return it;。 - 否則,如果 std::iter_reference_t<I> 是引用型別,則等價於 auto&& tmp = *it; return std::addressof(tmp);。
- 否則,等價於 return proxy(*it);,其中
proxy
是僅用於說明的類 (4)。
requires
子句中的表示式等價於std::indirectly_readable<const I> && (
requires(const I& i) { i.operator->(); } ||
std::is_reference_v<std::iter_reference_t<I>> ||
std::constructible_from<std::iter_value_t<I>, std::iter_reference_t<I>>
目錄 |
[編輯] 引數
(無)
[編輯] 返回值
1,2) 當前元素的引用,或純右值臨時量。等價於 *it。
3) 指向當前元素的指標或迭代器,或持有它的代理,如上所述。
[編輯] 示例
執行此程式碼
#include <complex> #include <initializer_list> #include <iostream> #include <iterator> using std::complex_literals::operator""i; int main() { const auto il = {1i, 3.14 + 2i, 3i, 4i, 5i}; using CI = std::common_iterator< std::counted_iterator<decltype(il)::iterator>, std::default_sentinel_t>; CI ci{std::counted_iterator{std::next(begin(il), 1), std::ssize(il) - 1}}; std::cout << *ci << ' ' << ci->real() << '\n'; }
輸出
(3.14,2) 3.14
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3574 | C++20 | variant 完全為 constexpr (P2231R1) 但 common_iterator 不是 |
也設為 constexpr |
LWG 3595 | C++20 | 代理型別函式缺少 constexpr 和 noexcept | 已新增 |
LWG 3672 | C++20 | operator-> 在通常情況下可能返回引用 |
總是按值返回 |
[編輯] 另請參閱
構造一個新的 common_iterator (public member function) |