像这样有效的 C++20 代码吗?
#include <iostream>
template <typename T>
concept impls_decrement = requires(T it) { it.decrement(); };
template <class Derived>
struct iterator_facade {
Derived& operator--()
requires impls_decrement<Derived>
{
auto& self = static_cast<Derived&>(*this);
self.decrement();
return self;
}
};
struct my_iterator : iterator_facade<my_iterator> {
void decrement() {
std::cout << "decrement" << std::endl;
}
};
int main() {
my_iterator iter;
--iter;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
改编自vector-of-bool博客文章。
使用最新版本的 gcc,代码工作正常,但最新版本的 clang 出现此错误:
prog.cc:25:4: error: cannot decrement value of type 'my_iterator'
--iter;
^ ~~~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)
哪个编译器是正确的?
正如 Barry 提到的,代码是有效的,这是 Clang bug 44833。
与此同时,我可以通过编写如下代码(演示)来解决这个问题:
#include <iostream>
template <typename T>
concept impls_decrement = requires(T it) { it.decrement(); };
template <class Derived>
struct iterator_facade {
template <class T=Derived>
requires impls_decrement<T>
Derived& operator--()
{
auto& self = static_cast<Derived&>(*this);
self.decrement();
return self;
}
};
struct my_iterator : iterator_facade<my_iterator> {
void decrement() {
std::cout << "decrement" << std::endl;
}
};
int main() {
my_iterator iter;
--iter;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |