在回答完这个问题并阅读本文后,看看这段代码,我想constexpr find
用简单的数组类实现.
考虑以下示例:
#includetemplate 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迭代器:
templateclass 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_iteratorconst_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编译得很好,或者两个片段有区别?