Mor*_*enn 8 c++ compile-time initializer-list variadic-templates c++11
我正在玩索引技巧,看看我可以去哪里,并遇到一个奇怪的错误...首先,简单的不那么老的指数:
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...>
{};
Run Code Online (Sandbox Code Playgroud)
我创建了一个从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];
}
};
Run Code Online (Sandbox Code Playgroud)
所以,我尝试创建一个函数,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)... };
}
Run Code Online (Sandbox Code Playgroud)
并完成代码,这是我的主要:
int main()
{
constexpr array<int> a = { 1, 2, 3 };
constexpr auto b = add_one(a, make_indices<a.size()>());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不认为代码会编译,但我对错误消息(这是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
Run Code Online (Sandbox Code Playgroud)
那么,有人可以向我解释在上面的代码中对于编译器究竟有什么不够的常量吗?
编辑:该问题的后续行动
来自:这个人本人\n http://www.stroustrup.com/sac10-constexpr.pdf
\n\n具体来说:\n 它的返回类型及其参数的类型(如果有)都是文字类型(参见 x2.2)。具体而言,文字类型包括 bool、\nint 或 double;\n 其主体是以下形式的复合语句\n{ return expr; }\n其中 expr 是这样的,如果\n适当类型的任意常量表达式被替换为 expr 中的参数,则\n结果表达式是一个常量表达式,如 x2 的介绍性段落中的 de\xef\xac\x81ned。表达式 expr 称为势常量表达式。
\n 归档时间: |
|
查看次数: |
1266 次 |
最近记录: |