首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您可以在CRTP方法中对派生类使用约束吗?

您可以在CRTP方法中对派生类使用约束吗?
EN

Stack Overflow用户
提问于 2021-02-16 09:08:55
回答 1查看 104关注 0票数 7

下面这样的代码是有效的C++20代码吗?

代码语言:javascript
复制
#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;
}

改编自vector-of-bool博客文章。

在最新版本的gcc中,代码支持fine,但最新版本的clang提供了此error

代码语言:javascript
复制
prog.cc:25:4: error: cannot decrement value of type 'my_iterator'
   --iter;
   ^ ~~~~
1 error generated.

哪个编译器是正确的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-27 04:54:13

正如巴里提到的,代码是有效的,这是Clang bug 44833

同时,我能够通过像这样编写代码(demo)来解决这个问题:

代码语言:javascript
复制
#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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66217479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档