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

152
08 февраля 2018, 17:31

Применяю std::remove_reference_t для выделения памяти под тип указателя, т.е.:

p = new remove_reference_t <decltype (*p)> [10];

Этот способ мне подсказали, но я не разобрался как работает remove_reference_t. Есть ли какие-то "подводные камни" о которых мне следовало бы знать?

Answer 1

Если p имеет обычный "голый" указательный тип, то никаких подводных камней тут нет.

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

В этом случае *p - как раз lvalue. Ссылочный тип в new нас не устраивает, т.е. нам надо превратить тип T & обратно в T, по каковой причине и приходится применять std::remove_reference_t.

READ ALSO
Оповещение об ошибках

Оповещение об ошибках

Как включить подчеркивание ошибок красными волнистыми линиями в QT Creator?

181
Чем отличаются стандарты c++14 и gnu++14?

Чем отличаются стандарты c++14 и gnu++14?

Есть ли существенные отличия между двумя стандартами c++14 и gnu++14 (расширение GNU)? Имеет ли смысл для компиляции под линуксом придерживаться...

170
QT. Не работают стили в .qml файле

QT. Не работают стили в .qml файле

style подчеркивается красным и выбивает ошибку "Неверное название свойства style(M16)", хотя вроде бы все подключил, в документации так же все делается

184
Как прочитать bmp в cv::Mat?

Как прочитать bmp в cv::Mat?

Очень хочу понять как преобразовать данный од чтобы он работал для открытия 1-битных bmp файловВот нашёл такой код

210