当前位置:  开发笔记 > 编程语言 > 正文

Constexpr找到实现

如何解决《Constexpr找到实现》经验,为你挑选了0个好方法。

在回答完这个问题并阅读本文后,看看这段代码,我想constexpr find用简单的数组类实现.

考虑以下示例:

#include 

template 
constexpr auto constexpr_find(const It& b, const It& e, T value) {
    auto begin = b;
    while (begin != e) {
        if (*begin == value) break;

        ++begin;
    }
    return *begin;
}

template
class array
{
public:
   typedef T* iterator;
   typedef const T* const_iterator;
   constexpr auto begin() const { return const_iterator(array_); }
   constexpr auto end() const { return const_iterator(array_ + N); }

   T array_[N];
   static constexpr size_t size = N;
};

int main()
{
   constexpr array array{{0,2,3}};
   static_assert(constexpr_find(array.begin(), array.end(), 0) == 0, "");
}

按预期编译

并使用自定义constexpr迭代器:

template
class array_iterator
{
public:
   constexpr array_iterator(const T* v) : iterator(v)
   {
   }
   constexpr const T& operator * () const { return *iterator; }
   constexpr array_iterator& operator ++()
   {
      ++iterator;
      return *this;
   }
   constexpr bool operator != (const array_iterator& other) const { return iterator != other.iterator; }
private:
   const T* iterator;
};

在数组类中:

typedef const array_iterator const_iterator;

这是唯一的区别,编译器给我错误:

在constexpr扩张 constexpr_find, int>(array.array::begin(), array.array::end(), 0)

错误:(((const int*)(& array.array::array_)) != (((const int*)(& array.array::array_)) + 12u))不是常量表达式

实例

这个gcc bug,因为clang编译得很好,或者两个片段有区别?

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有