Это потому, что массивы не могут быть переданы значением в функцию.Таким образом, чтобы заставить его работать, массив распадается на указатель, который затем передается функции по значению .
Другими словами, передача массива по значению похожа на инициализацию массива с другим массивом, но в C ++ массив не может быть инициализирован с другим массивом:
char buff[3] = {0,0,0};
char x[3] = buff; //error
Таким образом, если массив появляется справа от =
, левая сторона должна иметь тип pointer
или reference
:
char *y = buff; //ok - pointer
char (&z)[3] = buff; //ok - reference
Демонстрация: http://www.ideone.com/BlfSv
Это точно по той же причине auto
выводится по-разному в каждом случае ниже (обратите внимание, что auto
поставляется с C ++ 11):
auto a = buff; //a is a pointer - a is same as y (above)
std::cout << sizeof(a) << std::endl; //sizeof(a) == sizeof(char*)
auto & b = buff; //b is a reference to the array - b is same as z (above)
std::cout << sizeof(b) << std::endl; //sizeof(b) == sizeof(char[3])
Выход:
4 //size of the pointer
3 //size of the array of 3 chars
Демонстрация: http://www.ideone.com/aXcF5