意外非常量std::initializer_list
Unexpected non-constant std::initializer_list
我玩了一下索引技巧,看看我可以去哪里,遇到了一个奇怪的错误…首先,普通的不太旧的索引:
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...>
{};
我创建了一个从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];
}
};
因此,我尝试创建一个函数,该函数在每个成员添加1后返回array
的副本:
template<typename T, std::size_t... I>
auto constexpr add_one(const array<T>& a, indices<I...>)
-> const array<T>
{
return { (a[I]+1)... };
}
结束代码,下面是我的main:
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
所以,有人能解释给我到底是什么是不够恒定的编译器在上面的代码?
EDIT:这个问题的后续问题
- 是否合法声明constexpr std::initializer_list对象? 关于常量表达式的困惑
来自:本人http://www.stroustrup.com/sac10-constexpr.pdf
具体地说:它的返回类型及其参数的类型(如果有的话)都是文字类型类型(参见x2.2)。具体来说,文字类型包括bool、Int,或double;它的主体是如下形式的复合语句{返回expr;}exp是这样的,如果任意常数表达式然后,用适当的类型替换expr中的参数中定义的常量表达式x2的引言段。表达式expr被称为a势常数表达式
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- C++中带有List类的迭代器Segfault
- 使用"std::unordereded_map"映射到"std::list"对象
- GCC对可能有效的代码抛出init list生存期警告
- 使用std::list创建循环链表
- C2664 无法从'initializer list'转换参数
- 使用 std::min "no matching function for call to ‘min(<brace-enclosed initializer list>)’"时出错
- 在C++中标记化"Braced Initializer List"样式字符串(使用 Boost?
- "默认参数":无法从'initializer list'转换为'std::initializer_list'
- 无法从'initializer-list'转换为用户控制器
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- 递归调用中出现错误"[Error] expression list treated as compound expression in initializer [-fpermissive]"
- VS2015无法从'initializer list'转换为'std::string'错误
- 编译器错误:"Non-aggregates cannot be initialized with initializer list."
- 无法转换...从 '<brace-enclosed initializer list>' 到 地图
- 无法将'<brace-enclosed initializer list>'转换为'double'作为回报
- <function-style-cast> 错误:无法从'initializer list'转换为'std::thread'
- initializer语言 - list不能转换为const margin *