C++中的Constexpr迭代程序
Constexpr Iterator in C++
我有兴趣为个人项目创建一个非常小的constexpr容器。我需要的最重要的东西是一个具有真正constexpr迭代器的容器。它们最终将被添加到标准中(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0858r0.html)但我想知道如何在当前的C++中实现它们。
假设我有一个这样的数据结构:
template <typename T, unsigned N>
struct array {
const T data[N];
template<typename... Args>
constexpr array(const Args&... args) : data{args...} {
}
struct array_iterator {
T const* ptr;
constexpr array_iterator(const T* ptr) : ptr(ptr) {}
constexpr void operator++() { ++ptr; }
constexpr void operator--() { --ptr; }
constexpr T const& operator* () const { return *ptr; }
constexpr bool operator==(const array_iterator& rhs) const { return *(*this) == *rhs; }
constexpr bool operator!=(const array_iterator& rhs) const { return !(*this == rhs); }
};
constexpr array_iterator begin() const { return array_iterator(data); }
constexpr array_iterator end() const { return array_iterator(data + N); }
};
我需要的是能够在constexpr上下文中实际使用迭代器:
constexpr array<int, 3> arr(1, 2, 3);
constexpr auto it = arr.begin();
但很明显,由于我在处理非constexpr-ptr子对象,我遇到了这样的错误:
iterator.cpp:46:18: error: constexpr variable 'it' must be initialized by a
constant expression
constexpr auto it = arr.begin();
^ ~~~~~~~~~~~
iterator.cpp:46:18: note: pointer to subobject of 'arr' is not a constant
expression
iterator.cpp:45:27: note: declared here
constexpr array<int, 3> arr(1, 2, 3);
^
那么,对于类似容器的数组,什么是最小constexpr迭代器呢?
constexpr
有一些含义。
它可以意味着一个可以在编译时计算的值。它可能意味着一个函数,在给定编译时参数的情况下,可以生成可以在编译时计算的输出。
您发现迭代器无法引用自动存储constexpr
对象。另一方面,它们可以在constexpr
函数内被调用。
template <typename T, unsigned N>
struct array {
const T data[N];
template<typename... Args>
constexpr array(const Args&... args) : data{args...} {}
struct array_iterator {
T const* ptr;
constexpr array_iterator(const T* ptr) : ptr(ptr) {}
constexpr void operator++() { ++ptr; }
constexpr void operator--() { --ptr; }
constexpr T const& operator* () const { return *ptr; }
constexpr bool operator==(const array_iterator& rhs) const { return ptr == rhs.ptr; }
constexpr bool operator!=(const array_iterator& rhs) const { return !(*this == rhs); }
};
constexpr array_iterator begin() const { return array_iterator(data); }
constexpr array_iterator end() const { return array_iterator(data + N); }
};
constexpr int sum() {
int retval = 0;
constexpr array<int, 3> arr = {1,2,3};
for (int x : arr)
retval += x;
return retval;
}
int main() {
array<int, sum()> test;
(void)test;
}
您的operator==
已损坏,但修复后,我们可以在constexpr
上下文中调用sum()
,后者反过来使用迭代器。
相关文章:
- C++中的Constexpr迭代程序
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 在C++程序中使用的迭代器中未处理的异常
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 需要循环帮助以迭代方式添加到程序集中的总和变量
- 矢量迭代器在尝试调用函数时使我的程序崩溃
- std::使用迭代器映射查找距离,程序不会终止
- C++程序在迭代到数组的最后一个元素时崩溃
- 通过C 地图周期性迭代,程序崩溃
- 该程序无法显示第二个迭代的输出
- C 程序放慢迭代速度
- 使用矢量迭代器时,程序中断
- 双向迭代程序的decltype(*it)是什么
- c++迭代程序在向量上迭代时崩溃
- MergeSort.使用迭代程序实现
- 类中的C++迭代程序没有将结构作为类型
- 不带迭代程序的哈希映射循环
- C++迭代程序访问下一个元素进行比较
- 重载运算符==具有采用模板化迭代程序的自由函数