Страницы

Поиск по вопросам

воскресенье, 9 июня 2019 г.

Что делает std::remove_reference_t?

Применяю std::remove_reference_t для выделения памяти под тип указателя, т.е.:
p = new remove_reference_t [10];
Этот способ мне подсказали, но я не разобрался как работает remove_reference_t. Есть ли какие-то "подводные камни" о которых мне следовало бы знать?


Ответ

Если p имеет обычный "голый" указательный тип, то никаких подводных камней тут нет.
Особенность тут скорее содержится в decltype. Когда decltype применено непосредственно к имени переменной (напр. decltype(p)), то в результате получается тот тип, с которым эта переменная объявлена. А вот когда decltype применено к какому-то более сложному выражению, результирующий тип зависит от категории значения (value category) этого выражения. Для lvalue аргумента типа T получится ссылочный тип T &, т.е. lvalue-ссылка.
В этом случае *p - как раз lvalue. Ссылочный тип в new нас не устраивает, т.е. нам надо превратить тип T & обратно в T, по каковой причине и приходится применять std::remove_reference_t.

Комментариев нет:

Отправить комментарий