Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
1

Применение std::forward

20.09.2016, 13:44. Просмотров 1378. Ответов 6
Метки нет (Все метки)

Хочу сделать внутри метода большой обьект. Затем передать его через return. Для этого хочу использовать move семантику. Верно ли данное решение?

C++
1
2
3
4
5
6
static Hotkey makeHotkey(std::initializer_list<DWORD> initParams) {
        assert(initParams.size() <= MAXIMUN_PARAM_COUNT);
        Hotkey hKey; // или должна быть rvalue ссылка? т.е. Hotkey&& hKey = Hotkey(); ?
        std::for_each(initParams.begin(), initParams.end(), [](Hotkey& hKey, DWORD key) { hKey.m_keys.push_back(key); });
        return std::forward<Hotkey>(hKey);
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2016, 13:44
Ответы с готовыми решениями:

C++11 - std::forward и static_assert
Привет. Эта тема создана в познавательных целях. А именно, мне не совсем понятна реализация...

Зачем в определении std::forward () нужен объект remove_reference?
Зачем в определении std::forward() нужен объект remove_reference ? И почему не могут быть выведены...

В каком случае используется вторая перегрузка std::forward?
В каком случае используется втарая перегрузка std::forward? //clang 3.8.0 #include...

Применение std::max_element с функцией сравнения
Здравствуйте. Есть набор точек типа struct dot { double x, y, z; }; Нужно найти точку с...

6
129 / 101 / 58
Регистрация: 26.10.2013
Сообщений: 306
20.09.2016, 13:48 2
Почитайте про NRVO и RVO.
0
63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
20.09.2016, 13:53  [ТС] 3
Мне нужно сделать это явно, не полагаясь на компилятор.
0
13890 / 7424 / 1761
Регистрация: 30.01.2014
Сообщений: 12,420
20.09.2016, 13:56 4
Цитата Сообщение от maxm Посмотреть сообщение
Верно ли данное решение?
Оно избыточно. И потенциально блокирует более эффективные RVO/NRVO.

Достаточно оставить так:
C++
1
2
3
4
5
6
static Hotkey makeHotkey(std::initializer_list<DWORD> initParams) {
        assert(initParams.size() <= MAXIMUN_PARAM_COUNT);
        Hotkey hKey; 
        std::for_each(initParams.begin(), initParams.end(), [](Hotkey& hKey, DWORD key) { hKey.m_keys.push_back(key); });
        return hKey;
}
и при наличии у Hotkey конструктора перемещения, он и будет использоваться (в худшем случае), а в лучшем случае вообще ничего не будет вызвано, т.к. сработает NRVO.
0
63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
20.09.2016, 17:08  [ТС] 5
А когда применение std::forward оправдано?
0
13890 / 7424 / 1761
Регистрация: 30.01.2014
Сообщений: 12,420
20.09.2016, 17:13 6
Цитата Сообщение от maxm Посмотреть сообщение
А когда применение std::forward оправдано?
Поясните по move конструктору
0
Эксперт С++
4967 / 3074 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
20.09.2016, 17:14 7
Цитата Сообщение от maxm Посмотреть сообщение
А когда применение std::forward оправдано?
Когда нужно передать аргумент вызываемой функции в таком виде, в каком он попал в вызывающую.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.09.2016, 17:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы....

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...

Std::bind, std::mem_fun, std::mem_fn
В чем разница между функциями std::bind, std::mem_fun, std::mem_fn?

Std::begin() ,std::end(),std::copy
...// int main() { std::vector&lt;double&gt; data;//Работает cout &lt;&lt; std::begin(data); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.