class C
{
public:
C() : arr({1,2,3}) //doesn't compile
{}
/*
C() : arr{1,2,3} //doesn't compile either
{}
*/
private:
int arr[3];
};
Я считаю, что причина в том, что массивы можно инициализировать только с помощью =
синтаксиса, а именно:
int arr[3] = {1,3,4};
Вопросы
- Как я могу делать то, что хочу (то есть инициализировать массив в конструкторе (не назначая элементы в теле)). Это вообще возможно?
- Говорит ли стандарт C ++ 03 что-нибудь особенное об инициализации агрегатов (включая массивы) в инициализаторах ctor? Или недействительность приведенного выше кода является следствием каких-то других правил?
- Списки инициализаторов C ++ 0x решают проблему?
PS Прошу не упоминать векторы, boost :: array и их превосходство над массивами, о чем я хорошо осведомлен.
c++
c++11
initializer-list
ctor-initializer
aggregate-initialization
Армен Цирунян
источник
источник
Ответы:
Да. Он использует структуру, содержащую массив. Вы говорите, что уже знаете об этом, но тогда я не понимаю вопроса. Таким образом, вы делаете инициализации массива в конструкторе, без назначений в организме. Вот что
boost::array
делает.Инициализатор памяти использует прямую инициализацию. И правила пункта 8 запрещают подобное. Я не совсем уверен насчет следующего случая, но некоторые компиляторы допускают это.
См. Этот PR GCC для получения дополнительной информации.
Да, есть. Однако, я думаю, ваш синтаксис неверен. Вы должны использовать фигурные скобки напрямую, чтобы запустить инициализацию списка
источник
char * const foo[6];
ученик. Требуется, чтобы инициализатор компилировался на C ++ 11.C ++ 98 не предоставляет прямого синтаксиса для чего-либо, кроме обнуления (или для элементов, не относящихся к POD, инициализации значения) массива. Для этого вам просто напишите
C(): arr() {}
.Я думаю, что Роджер Пейт ошибается насчет предполагаемых ограничений агрегированной инициализации C ++ 0x, но мне лень искать или проверять, и это не имеет значения, не так ли? РЕДАКТИРОВАТЬ : Роджер говорил о «C ++ 03», я неправильно истолковал его как «C ++ 0x». Извини, Роджер. ☺
Обходной путь C ++ 98 для вашего текущего кода заключается в том, чтобы обернуть массив в a
struct
и инициализировать его статической константой этого типа. В любом случае данные должны где-то находиться. Без манжеты это может выглядеть так:источник
Обходной путь:
источник
В C ++ 03 агрегированная инициализация применяется только с синтаксисом, подобным приведенному ниже, который должен быть отдельным оператором и не подходит для инициализатора ctor.
источник
Как насчет
?
Хорошо компилируется на g ++ 4.8
источник
Вы хотите инициализировать массив целых чисел в своем конструкторе? Направьте его на статический массив.
источник