c++ - C++20:从自定义迭代器制作反向迭代器失败
问题描述
我正在我的 B-Tree 实现上从我的自定义迭代器制作一个反向迭代器,但它无法工作。
完整代码:https ://wandbox.org/permlink/hrM32RYb6oVHDHAm
我的迭代器实现:
class BTreeIterator {
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::bidirectional_iterator_tag;
Node* node;
std::vector<T>::iterator it;
void Increment() {
// ...
}
void Decrement() {
// ...
}
public:
BTreeIterator(Node* node, std::size_t i) : node {node} {
assert(node && i <= node->key.size());
it = node->key.begin() + i;
}
reference operator*() const {
return *it;
}
pointer operator->() const {
return it;
}
BTreeIterator& operator++() {
Increment();
return *this;
}
BTreeIterator operator++(int) {
BTreeIterator temp = *this;
Increment();
return temp;
}
BTreeIterator& operator--() {
Decrement();
return *this;
}
BTreeIterator operator--(int) {
BTreeIterator temp = *this;
Decrement();
return temp;
}
friend bool operator==(const BTreeIterator& x, const BTreeIterator& y) {
return x.node == y.node && x.it == y.it;
}
friend bool operator!=(const BTreeIterator& x, const BTreeIterator& y) {
return !(x == y);
}
};
我的 typedef 声明class BTree
:
using iterator = BTreeIterator;
using const_iterator = BTreeConstIterator;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
iterator begin_;
const_iterator cbegin_;
iterator end_;
const_iterator cend_;
// ...
reverse_iterator rbegin() {
return reverse_iterator(end_);
}
const_reverse_iterator rbegin() const {
return const_reverse_iterator(cend_);
}
const_reverse_iterator crbegin() const {
return const_reverse_iterator(cend_);
}
reverse_iterator rend() {
return reverse_iterator(begin_);
}
const_reverse_iterator rend() const {
return const_reverse_iterator(cbegin_);
}
const_reverse_iterator crend() const {
return const_reverse_iterator(cbegin_);
}
编译器因此抱怨:
error: return-statement with a value, in function returning 'std::reverse_iterator<BTree<int, 2>::BTreeConstIterator>::reference' {aka 'void'}
该标准给出(https://en.cppreference.com/w/cpp/iterator/reverse_iterator):
直到 C++20,std::reverse_iterator<Iter>::reference
一直等于std::iterator_traits<Iter>::reference
(在我的情况下,T&
)
自 C++20 以来,std::reverse_iterator<Iter>::reference
已更改为
std::iter_reference_t<Iter> = decltype(*std::declval<Iter&>())
It似乎已成为void
我的情况,导致错误。
我的问题:
- 更改派生反向迭代器的引用类型的基本原理是什么?
- 为什么我的
BTreeIterator
类型不可引用?decltype(*std::declval<BTreeIterator&>())
给void
. 我怎样才能将其更改为T&
?
解决方案
推荐阅读
- jenkins - 如何在 Jenkins 上从 SVN 进行稀疏结帐和更新?
- windows - 通过 NSIS Envar-plugin 设置环境变量
- here-api - 如何通过 API 向 Here Maps 添加新地点?
- javascript - 打字稿 | 与端点的接口
- r - 加速 R 函数
- android - 使用 Cloud Vision REST Api 而不是 Firebase vision api 进行模糊检测
- php - 如何修复 WordPress 中的插件导致的 504 错误?
- html - 任何时候都只有一个 CSS 动画栏
- spring - Spring Boot 安全 403“拒绝访问”
- laravel-5 - 如何解决与 PDO 连接预期不匹配的对等证书?