名前空間
変種
操作

std::move_iterator<Iter>::operator*,->

From cppreference.com
 
 
イテレータライブラリ
イテレータのコンセプト
イテレータのプリミティブ
アルゴリズムのコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
Rangeアクセス
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
 
reference operator*() const;
(1) (C++11以降)
(C++17 以降 constexpr)
pointer operator->() const;
(2) (C++11以降)
(C++17 以降 constexpr)
(C++20で非推奨)

現在の要素への右辺値参照またはポインタを返します。

目次

[edit] 戻り値

1) static_cast<reference>(*current )(C++20まで)ranges::iter_move(current )(C++20以降)

[edit] 注記

operator-> は、その結果を間接参照すると左辺値になる可能性があるため非推奨です。これにより、意図しない動作につながる可能性があります。

[edit]

#include <iomanip>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
 
void print(auto rem, const auto& v)
{
    for (std::cout << rem; const auto& e : v)
        std::cout << std::quoted(e) << ' ';
    std::cout << '\n';
}
 
int main()
{
    std::vector<std::string> p{"alpha", "beta", "gamma", "delta"}, q;
    print("1) p: ", p);
    for (std::move_iterator it{p.begin()}, end{p.end()}; it != end; ++it)
    {
        it->push_back('!'); // calls -> string::push_back(char)
        q.emplace_back(*it); // *it <- overload (1)
    }
    print("2) p: ", p);
    print("3) q: ", q);
 
    std::vector v{1, 2, 3};
    std::move_iterator it{v.begin()};
    // *it = 13; // error: using rvalue as lvalue
}

実行結果の例

1) p: "alpha" "beta" "gamma" "delta"
2) p: "" "" "" ""
3) q: "alpha!" "beta!" "gamma!" "delta!"

[edit] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 2106 C++11 operator* は、*current がprvalue を生成する場合、ダングリング参照を返す可能性があります。
reference if *current yields a prvalue
オブジェクトを返します
この場合に

[edit] 関連項目

インデックスで要素にアクセスする
(public member function) [編集]
English 日本語 中文(简体) 中文(繁體)