Является ли эта инициализация списка массива неизвестного размера допустимой в C ++ 0x? - PullRequest
3 голосов
/ 10 апреля 2010

Является ли эта инициализация списка массива неизвестного размера допустимой в C ++ 0x?

int main() { int x[]{0, 1,2,3,4}; return x[0]; }

Я верю, что это действительно так, но был бы признателен за подтверждение.

Если бы кто-нибудь мог процитировать C ++ 0x-FCD в поддержку своего дела, это было бы очень признательно.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 10 апреля 2010

Это происходит от 8.5/16 первого маркера до 8.5.4 списка инициализации и от 8.5.4/3 третьего маркера до 8.5.1 агрегированной инициализации, а затем 8.5.1/4 говорит

Массив неизвестного размера, инициализированный заключенным в скобки списком инициализаторов, содержащим n предложений инициализатора, где должно быть больше нуля, определяется как имеющий элементы

Единственное отличие, если объект представляет собой массив между = { ... } и { ... }, заключается в том, что первый из них называется copy-list-initialization , а второй называется direct-list-initialization , так что оба вида инициализации списка. Элементы массива инициализируются копией из элементов списка инициализатора в обоих случаях.

Обратите внимание, что между этими формами есть небольшая разница, если массив имеет размер, а список пуст, в этом случае применяется 8.5.4 второй маркер:

struct A {
  explicit A();
};

A a[1]{};    // OK: explicit constructor can be used by direct initialization
A a[1] = {}; // ill-formed: copy initialization cannot use explicit constructor

Это различие не применяется к спискам, в которых есть контент, и в этом случае третий пункт применяется снова, хотя

struct A {
  explicit A(int);
};

A a[1]{0};    // ill-formed: elements are copy initialized by 8.5.1
A a[1] = {0}; // ill-formed: same.

FCD изменил это по сравнению с предыдущим проектом, и инициализация с пустым списком инициализатора теперь всегда работает даже с явными конструкторами по умолчанию. Это связано с тем, что FCD заявляет, что элементы инициализируются значением, а инициализация значения не заботится о явности, поскольку она не выполняет разрешение перегрузки для конструкторов по умолчанию (в любом случае она не может выяснить, лучше или хуже совпадения). Предыдущий проект использовал нормальное разрешение перегрузки для конструкторов и, таким образом, отклонял явные конструкторы по умолчанию во время инициализации копирования. Этот отчет о дефектах сделал это изменение.

0 голосов
/ 10 апреля 2010

Да, это действительно, и было в течение десятилетий, даже в C. Размер просто устанавливается на количество поставляемых элементов. К сожалению, я не знаю ссылку.

(Добавлен бонус ...) Если вам нужно количество элементов, используйте sizeof(x)/sizeof(*x). Это безопаснее, чем жесткое кодирование константы, которая может стать недействительной, если вы добавите или удалите записи.

РЕДАКТИРОВАТЬ: Как указано в комментариях, в рассматриваемом коде отсутствует = (факт, который я пропустил), без которого он недопустим в любом текущем стандарте C или C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...