On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 01.08.18 16:56. Заголовок: Тип возвращаемого значения функции, когда спецификатор типа либо auto, либо decltype( auto )


Эта тема создана на основе следующего вопроса, заданного на сайте 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].

Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 31
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет