iter_move(std::counted_iterator)
From cppreference.com
< cpp | iterator | counted iterator
| friend constexpr decltype(auto) iter_move( const std::counted_iterator& i ) noexcept(noexcept(ranges::iter_move(i.base()))) |
(C++20以降) | |
基底イテレータの逆参照の結果を、それに関連付けられた右辺値参照型にキャストします。
関数本体は return ranges::iter_move(i.base()); と同等です。
この関数は、通常の 非修飾 または 修飾 ルックアップからは見えず、std::counted_iterator<I> が引数に関連付けられたクラスである場合にのみ、引数依存探索 (ADL) によって見つけることができます。
もし i.count() が 0 に等しい場合、動作は未定義です。
目次 |
[編集] パラメータ
| i | - | ソースイテレータアダプタ |
[編集] 戻り値
右辺値参照またはprvalueの一時オブジェクト。
[編集] 計算量
定数。
[編集] 例
このコードを実行
#include <iomanip> #include <iostream> #include <iterator> #include <string> #include <vector> void print(auto const& rem, auto const& v) { std::cout << rem << '[' << size(v) << "] {"; for (char comma[]{0, ' ', 0}; auto const& s : v) std::cout << comma << std::quoted(s), *comma = ','; std::cout << "}\n"; } int main() { std::vector<std::string> p{"Alpha", "Bravo", "Charlie"}, q; print("p", p); print("q", q); using RI = std::counted_iterator<std::vector<std::string>::iterator>; for (RI iter{p.begin(), 2}; iter != std::default_sentinel; ++iter) q.emplace_back(/* ADL */ iter_move(iter)); print("p", p); print("q", q); }
実行結果の例
p[3] {"Alpha", "Bravo", "Charlie"}
q[0] {}
p[3] {"", "", "Charlie"}
q[2] {"Alpha", "Bravo"}[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3953 | C++20 | 戻り値の型は std::iter_rvalue_reference_t<I> でした。 | decltype(auto) に変更されました。 |
[編集] 関連項目
| (C++20) |
オブジェクトの間接参照の結果を、その関連する右辺値参照型にキャストする (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
2つの基底イテレータが指すオブジェクトをスワップする (関数テンプレート) |
| (C++11) |
引数をxvalueに変換する (関数テンプレート) |
| (C++11) |
ムーブコンストラクタが例外を投げない場合に引数をxvalueに変換する (関数テンプレート) |
| (C++11) |
関数引数を転送し、型テンプレート引数を使用してその値カテゴリを維持する (関数テンプレート) |
| (C++20) |
要素の範囲を新しい場所にムーブする (アルゴリズム関数オブジェクト) |
| (C++20) |
要素の範囲を逆順で新しい場所にムーブする (アルゴリズム関数オブジェクト) |