【发布时间】:2018-10-26 17:23:06
【问题描述】:
我有兴趣为个人项目创建一个非常小的 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 迭代器?
【问题讨论】:
-
你只需要将
arr设为静态:static constexpr array<int, 3> arr(1, 2, 3); -
这确实有效!但不幸的是,如果您在 constexpr 函数中,则无法将变量设为静态,这是我认为这种类型的数据结构最有用的地方。
标签: c++ templates c++17 template-meta-programming constexpr