尝试更好地理解C ++大括号初始化语法

时间:2015-09-15 22:53:57

标签: c++ initializer-list list-initialization

为什么以下代码非法?

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

2 个答案:

答案 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。)