Существующий вопрос о Why can't I initialise an array of objects if they have private copy constructors? конкретно относится к C++ 03. Я знаю из этого вопроса, что то, что я пытаюсь сделать, не разрешено в C++ 03, но я думал, что это должно быть возможным в C++ 11Как инициализировать массив классов с помощью конструктора удаленных копий (C++ 11)
У меня есть недвижущийся класс (назовите его Child) и Мне нужно инициализировать массив Child в конструкторе другого класса (назовите его Parent). Под «non-movable» я подразумеваю, что адрес объекта Child должен оставаться неизменным во время жизни этого объекта. Каков правильный способ сделать это?
С C++ 11 Я попытался следующие:
class Child
{
public:
Child (int x) {}
~Child() {}
Child (const Child &) = delete;
};
class Parent
{
public:
Parent() : children {{5}, {7}} {}
private:
Child children[2];
};
Этот код компилируется нормально с Clang 3.5.0, но GCC 4.9.1 жалуется, что я пытаюсь использовать удаленный конструктор копирования:
test.cc: In constructor ‘Parent::Parent()’:
test.cc:13:35: error: use of deleted function ‘Child::Child(const Child&)’
Parent() : children {{5}, {7}} {}
^
test.cc:7:5: note: declared here
Child (const Child &) = delete;
^
Я прочитал о разнице между копией инициализацией и прямой инициализацией (here и here, к примеру), и я хочу, чтобы избежать вызова конструктора копирования с помощью прямой инициализации. Я неправильно понимаю синтаксис? Это ошибка в GCC? Или то, что я пытаюсь сделать, просто невозможно?
Кажется, что это ошибка clang, а не ошибка gcc. clang не может скомпилировать код, если вы измените его на 'children {Child {5}, Child {7}}', который должен вести себя одинаково с тем, что вы опубликовали. Обходным решением будет использование «vector» и замена объектов «Child». – Praetorian
g ++ успешно работает с дочерними детьми [2] {{5}, {7}}; 'который должен быть идентичен версии, где тот же самый инициализатор встречается в списке инициализаторов ctor; оба они защищены [dcl.init.list]/3 –
Чтение через разделы инициализации, этот код кажется правильным; 'children [2] = {{5}, {7}}' говорит, что 'children [0]' инициализируется копией из '{5}', т.е. это то же самое, что 'Child c = {5};', и это снова покрывается [dcl.init.list], который вызывает конструктор для 'c', который принимает' int' (без привлечения копии). –