Форум » C/C++ для начинающих (C/C++ for beginners) » Тип возвращаемого значения функции, когда спецификатор типа либо auto, либо decltype( auto ) » Ответить

Тип возвращаемого значения функции, когда спецификатор типа либо auto, либо decltype( auto )

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

Ответов - 0



полная версия страницы