Инициализация массива членов С++ без конструкторов по умолчанию

У меня есть класс Thing без конструктора по умолчанию.

Теперь мы определяем другой класс, который теперь должен сразу инициализировать элементы массива, так как без конструктора по умолчанию невозможно выполнить позднее присваивание. Итак, у нас есть:

class TwoThings
{
    public:

    Thing things[2];

    TwoThings() : things({Thing("thing 1"),Thing("thing 2")})
    {
    }
}

Это правильный путь?

GCC компилирует его нормально, а Clang нет, заявляя, что следует использовать «список инициализаторов». Я попробовал несколько альтернативных способов, таких как двойные фигурные скобки {{ ... }} и тому подобное, но не смог получить эквивалент компиляции для Clang.

Как инициализировать массивы без конструктора по умолчанию в Clang?


person dronus    schedule 20.04.2015    source источник


Ответы (1)


Да, инициализация массива членов в скобках является расширением GCC. Чтобы сделать его стандартным, вы можете просто использовать один набор фигурных скобок (требуется C++11):

TwoThings() : things{Thing("thing 1"),Thing("thing 2")}
{
}

Если вы не можете использовать C++11, вы можете использовать другой метод хранения, например std::pair<Thing,Thing> или std::vector<Thing>.

person TartanLlama    schedule 20.04.2015
comment
Итак, без этих расширений или С++ 11 (разрушает многие из моих старых библиотек) невозможно инициализировать массив? - person dronus; 20.04.2015
comment
Вы можете использовать другой метод хранения, например std::pair<Thing,Thing> или std::vector<Thing>. - person TartanLlama; 20.04.2015
comment
Я предполагаю, что std::vector также понадобятся элементы, имеющие конструктор по умолчанию? - person dronus; 20.04.2015
comment
Нет, вы можете использовать reserve и push_back вместо использования resize, чтобы он не строил что-либо по умолчанию. - person TartanLlama; 20.04.2015