试图更好地理解 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];
    }