Поскольку массивы типов C разбиты. В частности, вы не можете иметь аргумент функции с типом массива типа C; если вы пишете функцию (забыв о шаблонах на данный момент):
void foo(int arg[100]);
язык требует компилятор рассматривать это как:
void foo(int* arg);
(а 100
просто комментарий — это игнорируется компилятором ).
Для того, чтобы поддержать это в случае шаблонов, если компилятора пытается сопоставить не эталонный аргумент шаблона, он преобразует аргумент массива в указатель и типа вычета приведет к указателю тип, а не тип массива.
Результатом является то, что вы никогда не должны написать функцию (шаблон или иным образом), ожидающей массив в стиле C (для второго аргумента main
, где у вас нет выбора, кроме).
Поскольку эта брокерство присутствует только по соображениям Совместимость C, C++ не следует за ней, когда речь идет о ссылках . Таким образом:
template < typename T, size_t N >
void foo(T (&arg)[ N ]);
будет работать и должен дать вам одинаковые результаты в обоих случаях. Если вы считаете, что ваша функция может быть вызвана как с массивами стилей C и другими вещами (например, std :: vector), вы можете перегрузить его для обоих. Версия выше более специализированная, и будет предпочтительнее более общей версии, если это возможно.
Лучшим решением было бы избежать массивов стилей C полностью, но они полезны для статических переменных с инициализацией; это только с массивами стиля C, которые вы можете получить компилятором для подсчета количества элементов и определить размер массива в соответствии с списком инициализаторов. И имеют статическую инициализацию ; std::vector
будет считать инициализаторы на этапе , но используется как статическая переменная, может привести к возникновению порядка инициализации . C стиль массивы и
Я бы сказал: неправильное ожидание. возможно, хорошие ключевые слова google: распад указателя массива. – PlasmaHH
Сотни вопросов были отправлены в SO на основе недоразумений из-за разложения матриц на указатели, обычно с участием 'sizeof', но это новый подход. :-) –
Что вы хотите сказать, добавив ЗАКРЫТЬ к названию? –