Почему 'std :: vector <int> b {2};' создать 1-элементный вектор, а не 2-элементный?

Последние несколько дней я играл с C ++ 11 и придумал что-то странное.

Если я хочу равномерно инициализировать int:

int a{5};

Но если я сделаю то же самое с std :: vector:

std::vector<int> b{2};

Не создает двухэлементный массив, а скорее массив с одним элементом со значением два. Кажется, что для получения такого эффекта нужно быть более явным:

std::vector<int> c{{2}};
std::vector<int> d = {2};

Но не как объявление b - это кажется противоречивым. Я видел некоторые другие вещи с таким же эффектом. Что я спрашиваю - это поведение в окончательном стандарте C ++ 11, или это просто в проекте, который был реализован на ранней стадии? Если так, почему комитет по стандартам включил это поведение? Кажется, что это отрицает всю цель равномерной инициализации, поскольку нужно помнить, какие классы имеют конструкторы списка инициализаторов, и использовать синтаксис old () вместо {} только с этими классами. Или вообще отказывается от равномерной инициализации.

Это похоже на большую "гучу". Но могут быть и преимущества, о которых я не знаю.

Изменить: этот код:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> a{2};
    for (auto x: a) {
        std::cout << x << std::endl;
    }
    return 0;
}

выводит "2" на gcc 4.6.2

Ответы на вопрос(3)

Ваш ответ на вопрос