Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14 | страница 30
>f1
, но и возвращает ссылку на локальную переменную! Этот код ведет вас к неопределенному поведению, что вряд ли является вашей целью.Основной урок состоит в том, чтобы при использовании >decltype(auto)
уделять деталям самое пристальное внимание. Кажущиеся совершенно незначительными детали в выражении, для которого выводится тип, могут существенно повлиять на тип, возвращаемый >decltype(auto)
. Чтобы гарантировать, что выводимый тип — именно тот, который вы ожидаете, используйте методы, описанные в разделе 1.4.
В то же время не забывайте и о более широкой перспективе. Конечно, >decltype
(как автономный, так и в сочетании с >auto
) при выводе типов иногда может привести к сюрпризам, но это не нормальная ситуация. Как правило, >decltype
возвращает тот тип, который вы ожидаете. Это особенно верно, когда >decltype
применяется к именам, потому что в этом случае >decltype
делает именно то, что скрывается в его названии: сообщает объявленный тип (declared type) имени.
• >decltype
почти всегда дает тип переменной или выражения без каких-либо изменений.
• Для lvalue-выражений типа >Т
, отличных от имени, >decltype
всегда дает тип >T&
.
• C++14 поддерживает конструкцию >decltype(auto)
, которая, подобно >auto
, выводит тип из его инициализатора, но выполняет вывод типа с использованием правил >decltype
.
1.4. Как просмотреть выведенные типы
Выбор инструментов для просмотра результатов вывода типа зависит от фазы процесса разработки программного обеспечения, на которой вы хотите получить эту информацию. Мы рассмотрим три возможности: получение информации о выводе типа при редактировании кода, во время компиляции и во время выполнения.
Редакторы исходных текстов в IDE часто показывают типы программных сущностей (например, переменных, параметров, функций и т.п.), когда вы, например, помещаете указатель мыши над ними. Например, пусть у вас есть код
>const int theAnswer = 42;
>auto x = theAnswer;
>auto y = &theAnswer;
Редактор, скорее всего, покажет, что выведенный тип >x
представляет собой >int
, а выведенный тип >y
— >const int*
.
Чтобы это сработало, ваш код должен быть в более-менее компилируемом состоянии, поскольку такого рода информация поставляется среде разработки компилятором С++ (или как минимум его клиентской частью), работающим в IDE. Если компилятор не в состоянии получить достаточно информации о вашем коде, чтобы выполнить вывод типа, вы не сможете увидеть выведенные типы.