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



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

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

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

А reference collapsing это совершенно другой зверек. Если убрать remove_reference и у тебя в качестве T пойдет какой-нибудь A&, то тип параметра t останется T& - одинарная ссылка.
...
Рейтинг: 0 / 0
13.08.2021, 11:18
    #40090500
shellye
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::forward Тонкости
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
13.08.2021, 12:26
    #40090530
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::forward Тонкости
Второй случай не будет компилироваться довольно часто с ошибкой "недопустимый тип".
Особенно если для него использовать decltype(auto). Для стандартных темплейтов это
неприемлемо. Поэтому в STL вот такие костыли на каждом первом шагу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.08.2021, 12:33
    #40090532
shellye
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::forward Тонкости
Dimitry Sibiryakov

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


А можно привести пример когда такой шаблон не скомпилируется ?
...
Рейтинг: 0 / 0
13.08.2021, 12:47
    #40090534
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::forward Тонкости
Как-то так:
Код: 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
13.08.2021, 20:44
    #40090667
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::forward Тонкости
Dimitry Sibiryakov,

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

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


А почему не компилится то ?
...
Рейтинг: 0 / 0
16.08.2021, 11:53
    #40090967
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::forward Тонкости
shellye, да какие тут тонкости?!
std::forward() используется для проброса значения шаблонного параметра (prvalue) в виде right-reference (xvalue). Для всего остального используется std::move().
...
Рейтинг: 0 / 0
16.08.2021, 21:08
    #40091106
shellye
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::forward Тонкости
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
17.08.2021, 10:25
    #40091150
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::forward Тонкости
shellye,

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


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

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


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