为什么以下代码非法?
for (int index=0; index<3; index++)
{
cout << {123, 456, 789}[index];
}
虽然这很好用:
for (int value : {123, 456, 789})
{
cout << value;
}
IDEOne中的代码:http://ideone.com/tElw1w
答案 0 :(得分:5)
虽然std::initializer_list
未提供operator[]
,但它确实存在begin()
和end()
的重载,这是基于使用的范围。实际上,您可以将initializer_list
转换为this:
for (int index=0; index<3; index++)
{
cout << begin({123, 456, 789})[index];
}
答案 1 :(得分:2)
像{123, 456, 789}
这样的 braced-init-list 本身没有类型,也无法编入索引(也没有与大多数其他运算符一起使用)。
基于范围的for
循环对此案例进行了特殊处理以使其正常工作。 (从技术上讲,特殊处理在内部使用的auto&&
中,从 braced-init-list 中推导出std::initializer_list
。)