Почему 'std::vector 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 — это кажется непоследовательным. Я видел некоторые другие вещи с тем же эффектом. Что я спрашиваю - это поведение в окончательном стандарте С++ 11, или это просто черновик, который был реализован раньше? Если да, то почему комитет по стандартам включил такое поведение? Кажется, что это противоречит всей цели унифицированной инициализации, поскольку нужно помнить, какие классы имеют конструкторы списка инициализаторов, и использовать старый синтаксис () вместо {} только с этими классами. Или вообще отказаться от юниформ-инициализации.

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

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

#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

23
задан Xeo 5 November 2012 в 20:14
поделиться