![]() |
|||||||||||
1 | |||||||||||
C++11 - std::forward и static_assert02.11.2014, 19:30. Просмотров 2165. Ответов 5
Метки нет Все метки)
(
Привет.
Эта тема создана в познавательных целях. А именно, мне не совсем понятна реализация шаблонной функции std::forward. Вот так она выглядит в GCC и Clang:
Разнообразными способами я пытался включить этот "триггер", но увы...
0
|
|
02.11.2014, 19:30 | |
Применение std::forward В каком случае используется вторая перегрузка std::forward?
Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream |
|
2821 / 1630 / 252
Регистрация: 03.12.2007
Сообщений: 4,222
|
||||||
02.11.2014, 19:54 | 2 | |||||
![]() Решение
1
|
С чаем беда...
![]() ![]() 8282 / 4056 / 1114
Регистрация: 18.10.2014
Сообщений: 8,759
|
||||||
02.11.2014, 21:34 | 4 | |||||
Во-первых, определение std::forward, которое вы процитировали - это определение из C++14, принятого лишь в августе. "В познавательных целях" совсем не обязательно вовлекать эти определения.
Во-вторых, в С++14 существует четыре перегруженных версии forward. Ваш код не вызывает этого static_assert просто потому, что компилируются и используются другие версии forward, именно те в которых никакого static_assert нет. Для вашего эксперимента достаточно оргинального forward из C++11, имеющего две перегруженных версии template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept; template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept; Опять же такой static_assert будет присутствовать только во второй версии. Ваш же оригинальный код, как вы не вертитесь с явной специализацией, будет вызывать именно первую. Чтобы вызвать вторую нужно либо явное rvalue в качестве аргумента, либо применение std::move. Т.е. в контексте вашего кода падать по этому static_assert будет
1
|
![]() |
|
02.11.2014, 22:11 [ТС] | 5 |
Во-первых, определение std::forward, которое вы процитировали - это определение из C++14[/quote]std::forward есть в стандарте C++11.
TheCalligrapher, дело не в том, что я процитировал. Это всего лишь не правильный пример. Я задал конкретный вопрос, ответ на который уже получен. Спасибо за ответ.
0
|
С чаем беда...
![]() ![]() 8282 / 4056 / 1114
Регистрация: 18.10.2014
Сообщений: 8,759
|
|
02.11.2014, 22:43 | 6 |
Считайте, что мой ответ предназначен не для вас, а для случайно прочитавшего данный вопрос неподготовленного зрителя, который недоуменно посмотрит на ваш вопрос и затем на ответ "который уже получен" и немедленно задастся следующим вопросом: с чего бы это вдруг в 'forward<int&>(1)' static_assert стреляет, а в 'forward<int &>( lvalue_ref )' - не стрелял. Тип 'T' ведь и там, и там один и тот же.
P.S. В мой предыдущий ответ закралась неточность: в С++14 две версии forward, а не четыре.
2
|
02.11.2014, 22:43 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
Ошибка в static_assert: выражение не определяется константой Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |