试图更好地理解 C++ 大括号初始化语法
Trying to understand C++ brace-initialization syntax better
为什么下面的代码是非法的?
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
像 {123, 456, 789}
这样的 braced-init-list 本身没有类型,不能被索引(也不能与大多数其他运算符一起使用)。
基于范围的 for
循环对这种情况进行了特殊处理以使其工作。 (从技术上讲,特殊处理在它内部使用的 auto&&
中,它从 braced-init-list 中推导出 std::initializer_list
。)
虽然 std::initializer_list
不提供 operator[]
,但它确实为 begin()
和 end()
提供了重载,这是使用范围的基础。实际上,您可以索引到 initializer_list
,例如 this:
for (int index=0; index<3; index++)
{
cout << begin({123, 456, 789})[index];
}
为什么下面的代码是非法的?
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
像 {123, 456, 789}
这样的 braced-init-list 本身没有类型,不能被索引(也不能与大多数其他运算符一起使用)。
基于范围的 for
循环对这种情况进行了特殊处理以使其工作。 (从技术上讲,特殊处理在它内部使用的 auto&&
中,它从 braced-init-list 中推导出 std::initializer_list
。)
虽然 std::initializer_list
不提供 operator[]
,但它确实为 begin()
和 end()
提供了重载,这是使用范围的基础。实际上,您可以索引到 initializer_list
,例如 this:
for (int index=0; index<3; index++)
{
cout << begin({123, 456, 789})[index];
}