std::common_iterator<I,S>::operator*,->
From cppreference.com
< cpp | iterator | common iterator
| constexpr decltype(auto) operator*(); |
(1) | (C++20以降) |
| constexpr decltype(auto) operator*() const requires /*dereferenceable*/<const I>; |
(2) | (C++20以降) |
| constexpr auto operator->() const requires /* see description */; |
(3) | (C++20以降) |
| ヘルパー型 |
||
| class /*proxy*/ { std::iter_value_t<I> keep_; |
(4) | (説明用*) |
現在の要素へのポインタまたは参照、あるいはそれらを保持するプロキシを返します。
基になる std::variant メンバオブジェクト var が I 型のオブジェクトを保持していない場合、すなわち std::holds_alternative<I>(var) が false と等しい場合、動作は未定義です。
var が保持している型 I のイテレータを it とすると、それは std::get<I>(var) です。
1,2)
it の逆参照の結果を返します。3) 現在の要素へのポインタまたはイテレータ、あるいはそれらを保持するプロキシを返します。
Iがポインタ型であるか、または式 it.operator->() がwell-formedである場合、 return it; と同等です。- そうでなく、 std::iter_reference_t<I> が参照型である場合、 auto&& tmp = *it; return std::addressof(tmp); と同等です。
- そうでなく、
proxyは公開専用クラス (4) であるとして、 return proxy(*it); と同等です。
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>>
目次 |
[edit] パラメータ
(なし)
[edit] 戻り値
1,2) 現在の要素への参照、またはprvalueの一時オブジェクト。 *it と同等です。
3) 上記で説明したように、現在の要素へのポインタまたはイテレータ、あるいはそれらを保持するプロキシ。
[edit] 例
このコードを実行
#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
[edit] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3574 | C++20 | variant は完全にconstexprでしたが(P2231R1)、 common_iterator はそうではありませんでした。 |
constexpr にもなりました。 |
| LWG 3595 | C++20 | プロキシ型の関数にはconstexprとnoexceptが欠けていました。 | 追加された |
| LWG 3672 | C++20 | operator-> は通常のケースでは参照で返される可能性があります。 |
常に値で返します。 |
[edit] 関連項目
新しいcommon_iteratorを構築します(public member function) |