我玩弄了一些索引技巧,看看我可以去哪里,遇到了一个奇怪的错误……首先,简单的不那么旧的索引:
template<std::size_t...>
struct indices {};
template<std::size_t N, std::size_t... Indices>
struct make_indices:
make_indices<N-1, N-1, Indices...>
{};
template<std::size_t... Indices>
struct make_indices<0, Indices...>:
indices<Indices...>
{};
我创建了一个从 a 派生的编译时数组类,std::initializer_list
并使其可索引(假设您的编译器支持N3471。无论如何它将在下一个标准中)。这里是:
template<typename T>
struct array:
public std::initializer_list<T>
{
constexpr array(std::initializer_list<T> values):
std::initializer_list<T>(values)
{}
constexpr auto operator[](std::size_t n)
-> T
{
return this->begin()[n];
}
};
因此,我尝试创建一个函数,该函数array
在向其每个成员添加 1 后返回一个副本:
template<typename T, std::size_t... I>
auto constexpr add_one(const array<T>& a, indices<I...>)
-> const array<T>
{
return { (a[I]+1)... };
}
并完成代码,这是我的主要内容:
int main()
{
constexpr array<int> a = { 1, 2, 3 };
constexpr auto b = add_one(a, make_indices<a.size()>());
return 0;
}
我不认为该代码无论如何都会编译,但我对错误消息感到非常惊讶(这是ideone代码):
In function 'int main()':
error: 'const smath::array<int>{std::initializer_list<int>{((const int*)(& const int [3]{2, 3, 4})), 3u}}' is not a constant expression
那么,有人可以向我解释上面代码中的编译器究竟是什么不够恒定吗?
编辑:该问题的后续行动