Причина строгого правила передачи массива по указателю на функцию в стандарте C ++ - PullRequest
0 голосов
/ 18 ноября 2010

В C ++ единственный способ передать массив функции - это указатель с учетом следующих функций:

void someFunc(sample input[7]){
 //whatever
}
void someFunc(sample input[]){
 //whatever
}
void someFunc(sample (& input)[7]){
 //whatever
}

Все вышеперечисленные параметры функции идентичны следующим параметрам функции, когда функция не встроена:

void someFunc(sample * input){
 //whatever
}

Теперь, чтобы передать массив со значением, мы должны поместить его в структуру, как показано ниже:

struct SampleArray{
 public:
  sample sampleArray[7];
};

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

Ответы [ 3 ]

2 голосов
/ 18 ноября 2010

Причины обратной совместимости.У C ++ не было другого выбора, кроме как унаследовать это поведение от C.

1 голос
/ 18 ноября 2010

В этом ответе на ранее подобный вопрос рассматриваются причины, по которым такое поведение было введено в C (или, более конкретно, почему массивы и массивы внутри структур обрабатываются языком по-разному).1004 * C ++ принял эту часть C, но добавил возможность передавать массивы по ссылке (обратите внимание, что ваша третья версия someFunc передает массив по ссылке и не эквивалентна использованию указателя на его первый элемент).Кроме того, C ++ включает в себя различные типы контейнеров, которые могут быть переданы по значению (недавно включая std::array)

0 голосов
/ 18 ноября 2010

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

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