![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Пытался ужаться с исходником покороче, но что уж вышло, то вышло.
Словом, была программа, которая работала себе, пока не захотелось ее сделать многопоточной. Вычисления проводились в классе, возврат значений шел путем передачи по ссылке. Ничего лишнего не модифицировалось, никакие переменные не пропадали (время жизни не заканчивалось), так что вроде все путем. Простая замена вызова на async привела к тому, что перестал работать возврат по ссылке. Словом, ужался, как мог, чтобы получить тот же эффект. При вызове обычной функции (не члена класса) такой эффект получить не удалось, не вышло даже передать аргумент по ссылке. Соответственно, эксперты, не поясните, что происходит? Т.е. как поступить - пояснять не надо, программа подправлена и все работает, но вот сам эффект - когда у переданного по ссылке аргумента изменился арес... Что это было? Почему? Где об этом почитать? Заранее спасибо. Компилятор - Visual C++ 2013.
Это сообщение отредактировал(а) disputant - 10.9.2015, 16:26 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Чтобы передать по ссылке используй std::ref
http://ideone.com/zmvJxG И, кстати, mem_fn тут не нужен Это сообщение отредактировал(а) borisbn - 11.9.2015, 09:17 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| disputant |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Спасибо! А где бы всерьез про это почитать, а то мои знания по этому вопросу практически только из Мейерса (Modern Effective C++) |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
disputant, шаблоны и выведение типов, пожалуй, самая сложная штука в С++.
Честно? Я нигде не читал, но каждый день захожу на StackOverflow и просматриваю интересные вопросы/ответы. Там уже был вопрос один в один как твой. Меня тогда заинтересовало - прочитал. Запомнил -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
disputant, погляди
для подобных штук в С++11 введены std::reference_wrapper и std::ref. Зачем еще они могут быть нужны описано например на cppreference.com |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
Всерьез почитать можно стандарт, а если попроще - здесь например
т.е. если аргумент, по которому происходит вывод типа, является ссылкой на тип P, то выведенные тип будет P (без ссылки). поэтому аргументы шаблона всегда являются значениями, если иного явно не указано в шаблоне. значит для передачи по ссылке надо "извратиться" обернуть агрумент в объект, ведущий себя как ссылка (или явно указывать типы при инстанцировании) Это сообщение отредактировал(а) baldina - 11.9.2015, 17:23 |
|||
|
||||
| disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Всем спасибо!
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |