Эта тема создана на основе следующего вопроса, заданного на сайте Stackoverflow [url="https://stackoverflow.com/questions/51633851/what-is-type-int"]"What is type int(*)[]"[/url]
Имеется следующее объявление класса
class A
{
int matrix[20][10];
public:
auto getter(){return matrix;}
};
Спрашивается, какой конкретный тип возвращаемого значения функции
getter?
Так как функция возвращает не заключенный в круглые скобки обозначение массива
mattrix, то обозначение массива неявно преобразуется к указателю на его первый элемент. То есть тип возвращаемого значения функции будет
int ( * )[10].
Если необходимо вернуть ссылку на массив, то в качестве спецификатора типа возвращаемого значения следует указать
decltype( auto ), а выражение в предложении
return заключить в круглые скобки.
Ниже приведена демонстрационная программа.
#include <iostream>
class A
{
private:
int matrix[20][10];
public:
auto getter1() { return ( matrix ); }
decltype( auto ) getter2() { return ( matrix ); }
};
int main()
{
A a;
std::cout << "sizeof( a.getter1() ) = " << sizeof( a.getter1() ) << '\n';
std::cout << "sizeof( a.getter2() ) = " << sizeof( a.getter2() ) << '\n';
}
Ее вывод на консоль
sizeof( a.getter1() ) = 8
sizeof( a.getter2() ) = 800
Как видно из вывода программы в первом случае выводится размер указателя, так как функция
getter1 имеет тип возвращаемого значения
int ( * )[10].
Во втором случае тип возвращаемого значения функции
getter2 является ссылочный тип
int ( & )[20][10].
Если в функции
getter2 убрать круглые скобки у возвращаемого значения, то опять будет применено неявное преобразования массива в указатель на его первый элемент, то есть возвращаемым типом будет тип
int ( * )[10].