std::move_iterator<Iter>::operator*,->
来自cppreference.com
<tbody>
</tbody>
reference operator*() const; |
(1) | (C++11 起) (C++17 起为 constexpr) |
pointer operator->() const; |
(2) | (C++11 起) (C++17 起为 constexpr) (C++20 弃用) |
返回到当前元素的右值引用或指针。
返回值
2)
current注解
operator-> 被弃用的原因是在解引用它的结果时可能会产生左值。这可能导致意外行为。
示例
运行此代码
#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('!'); // 调用 -> string::push_back(char)
q.emplace_back(*it); // *it <- 重载 (1)
}
print("2) p: ", p);
print("3) q: ", q);
std::vector v{1, 2, 3};
std::move_iterator it{v.begin()};
// *it = 13; // 错误:将右值用作左值
}
可能的输出:
1) p: "alpha" "beta" "gamma" "delta"
2) p: "" "" "" ""
3) q: "alpha!" "beta!" "gamma!" "delta!"
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 2106 | C++11 | *current 产生纯右值的情况下 operator* 会返回悬垂引用
|
此时直接返回该对象 |
参阅
| 按索引访问元素 (公开成员函数) |