Инициализация списка инициализаторов std :: array в списке инициализации - PullRequest
7 голосов
/ 05 февраля 2012

Хотя мне очень нравятся новые функции в C ++ 11, иногда мне кажется, что мне не хватает некоторых его тонкостей.

Инициализация массива int работает нормально, инициализация вектора Element2 работает нормально, ноинициализация массива Element2 завершается неудачно.Я думаю, что правильным синтаксисом должна быть строка без комментариев, но ни одна из попыток инициализации для меня не удалась.

#include <array>
#include <vector>

class Element2
{
    public:
            Element2(unsigned int Input) {}
            Element2(Element2 const &Other) {}
};

class Test
{
    public:
            Test(void) :
                    Array{{4, 5, 6}},
                    Array2{4, 5},
                    //Array3{4, 5, 6}
                    Array3{{4, 5, 6}}
                    //Array3{{4}, {5}, {6}}
                    //Array3{{{4}, {5}, {6}}}
                    //Array3{Element2{4}, Element2{5}, Element2{6}}
                    //Array3{{Element2{4}, Element2{5}, Element2{6}}}
                    //Array3{{{Element2{4}}, {Element2{5}}, {Element2{6}}}}
                    {}
    private:
            std::array<int, 3> Array;
            std::vector<Element2> Array2;
            std::array<Element2, 3> Array3;
};

int main(int argc, char **argv)
{
    Test();
    return 0;
}

Я пробовал это на g ++ 4.6.1 и 4.6.2 под MinGW.*

Как правильно выполнить инициализацию этого массива?Возможно ли это?

1 Ответ

6 голосов
/ 05 февраля 2012

Правильный способ сделать это - Array{{4, 5, 6}}.Вы не можете опустить фигурные скобки, когда инициализируете элемент с агрегированной инициализацией.Единственный раз, когда вы можете опустить фигурные скобки, это объявление в форме

T t = { ... }

Так что в вашем случае вы должны ввести все фигурные скобки: одну для самого std::array, а другую для intмассив.Для Array3 ваш синтаксис также правильный, так как int может быть неявно преобразован в Element2.

Из оставшихся закомментированных, Array3{{{4}, {5}, {6}}}, Array3{{Element2{4}, Element2{5}, Element2{6}}} и Array3{{{Element2{4}}, {Element2{5}}, {Element2{6}}}} тоже работают, но более многословно.Однако, с концептуальной точки зрения, Array3{{{4}, {5}, {6}}} производит наименьшее количество временных значений в реализациях, которые не выполняют копирование (я думаю, это не имеет значения, но все же полезно знать), даже меньше, чем Array3{{4, 5, 6}}, потому что вместо инициализации копирования выиспользуйте инициализацию списка копирования для вашего Element2, который не создает промежуточного временного для дизайна .

...