powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::forward Тонкости
15 сообщений из 15, страница 1 из 1
std::forward Тонкости
    #40090436
shellye
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
template< class T >
T&& forward( typename std::remove_reference<T>::type& t ) noexcept;



Поясните пожалуйста зачем здесь std::remove_reference<T>

Ведь даже если это убрать должен сработать Reference - collapsing

Спасибо.
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40090462
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет.
В данном случае, тип параметра t становится "чистым" без ссылок вообще.

А reference collapsing это совершенно другой зверек. Если убрать remove_reference и у тебя в качестве T пойдет какой-нибудь A&, то тип параметра t останется T& - одинарная ссылка.
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40090500
shellye
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Нет.
В данном случае, тип параметра t становится "чистым" без ссылок вообще.

А reference collapsing это совершенно другой зверек. Если убрать remove_reference и у тебя в качестве T пойдет какой-нибудь A&, то тип параметра t останется T& - одинарная ссылка.


Ну вот представим себе что у нас есть некоторое l-value и мы на нем запускаем forward

Что в таком

Код: plaintext
1.
2.
template< class T >
T&& forward( typename std::remove_reference<T>::type& t ) noexcept;




что в таком

Код: plaintext
1.
2.
template< class T >
T&& forward(T & t ) noexcept;




будет вызван этот же самый forward
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40090530
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй случай не будет компилироваться довольно часто с ошибкой "недопустимый тип".
Особенно если для него использовать decltype(auto). Для стандартных темплейтов это
неприемлемо. Поэтому в STL вот такие костыли на каждом первом шагу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40090532
shellye
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Второй случай не будет компилироваться довольно часто с ошибкой "недопустимый тип".
Особенно если для него использовать decltype(auto). Для стандартных темплейтов это
неприемлемо. Поэтому в STL вот такие костыли на каждом первом шагу.


А можно привести пример когда такой шаблон не скомпилируется ?
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40090534
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так:
Код: sql
1.
2.
3.
4.
std::unordered_map<int,int>& foo();

const auto& bar = foo();
std::forward<decltype(bar)::type::iterator>(bar.begin());


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40090667
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Вы же говорили, что программируете на "C with classes". Откуда у Вас такие познания?
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40090676
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravОткуда у Вас такие познания?

"О, сколько нам открытий чудных" готовит граблями усеянное поле.
Данный пример - из попытки использовать google protobuf.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40090681
shellye
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://www.cpp.sh/4bwpo


А почему не компилится то ?
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40090967
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shellye, да какие тут тонкости?!
std::forward() используется для проброса значения шаблонного параметра (prvalue) в виде right-reference (xvalue). Для всего остального используется std::move().
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40091106
shellye
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_dev
shellye, да какие тут тонкости?!
std::forward() используется для проброса значения шаблонного параметра (prvalue) в виде right-reference (xvalue). Для всего остального используется std::move().


Зачем тут

T&& forward( typename std::remove_reference<T>::type& t ) noexcept;

нужен std::remove_reference<T> ?

Ведь можно просто написать


T&& forward( T& t ) noexcept;


В чем разница ?
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40091150
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shellye,

Скорее всего это сделано чтобы отключить вывод типов шаблона, чтобы не дать вызвать std::forward без инстанцирования (что привело бы к неверному и опасному результату - lvalue ссылки бы превращались в rvalue).
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40091251
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shellye, не занимайся фигнёй!
Лучше почитай, что такое "Perfect Forwarding" .
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40093809
shellye
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_dev
shellye, не занимайся фигнёй!
Лучше почитай, что такое "Perfect Forwarding" .


Не поверишь именно этим и занимался

А в чем ты видишь занятие фигней ?
...
Рейтинг: 0 / 0
std::forward Тонкости
    #40095435
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shellye, на кой тебе тогда std::forward ?
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::forward Тонкости
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]