![]() 6343 / 3514 / 1427
Регистрация: 07.02.2019
Сообщений: 8,979
|
||||||
1 | ||||||
UB or not UB?02.07.2019, 13:50. Показов 1225. Ответов 12
Метки нет Все метки)
(
Здрасти, собственно вопрос в теме. По невнимательности забиндил не тот метод, но код скомпилировался и нормально работал работал, случайно заметил. Во внутренности functional не вникал пока, поясните по возможности, как так то, ё маё?
![]() Ситуация примерно такая:
0
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
02.07.2019, 13:57 | 2 |
zayats80888,
Вроде все нормально. Почему вы решили что UB? Добавлено через 1 минуту И зачем по дефолту Callback nullptr в B? У вас же всего один способ конструкции экземпляра B, а он уже подразумевает запись в поле с колбеком
0
|
![]() 6343 / 3514 / 1427
Регистрация: 07.02.2019
Сообщений: 8,979
|
|
02.07.2019, 14:00 [ТС] | 3 |
Я не решил, вот и спрашиваю.
![]() Добавлено через 1 минуту Привычка, это просто пример, так то там и default конструктор должен быть
0
|
![]() 1660 / 489 / 106
Регистрация: 17.05.2015
Сообщений: 1,500
|
|||||||||||
02.07.2019, 14:02 | 4 | ||||||||||
std::function - тонкая обертка над функторами-реализациями,которые непосредственно занимаются запуском функций/методов. В Вашем случае, такой функтор-реализация инстанцируется в строке: std::bind(&C::wrong, this) В действительности, вы можете запустить функтор и без std::function:
std::bind знает с какими аргументами его запустили.Зная типы аргументов, шаблон знает чем и как нужно параметризовать шаблон функтора-реализации. Таким образом, результат работы std::bind(&C::wrong, this) - это корректный функтор,заточенный под запуски именно вашей функци-члена &C::wrong ,именно под её количество аргументов. В этот момент абсолютно не важно, чем был параметризован std::function Функтор-реализация заточен для работы с &C::wrong , а не с std::function Вот здесь: Вы запускаете std::function без аргументов.Соответственно, он делегирует запуск функтору-реализации, и тоже - без аргументов. Соответственно, успешно запускается функция-член, потому что она как раз оказалась без аргументов. Вот если бы вы попытались выполнить запуск с аргументами, тогда конечно компиляция неизбежно бы сломалась:
1
|
![]() 6343 / 3514 / 1427
Регистрация: 07.02.2019
Сообщений: 8,979
|
||||||
02.07.2019, 14:21 [ТС] | 5 | |||||
как же без аргументов, когда
if (m_cb) m_cb(a, b); ?Добавлено через 15 минут eva2326, там должно было быть так:
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
02.07.2019, 14:38 | 6 |
Если у std::bind нет плейсхолдеров, то он передаёт параметры своего оператора () после сохранённых
2
|
зомбяк
![]() 1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||||||
02.07.2019, 14:41 | 7 | |||||
В данном случае в
std::function<void()> в std::function<void(int, int)> . Почему оно было допустимым, не понятно.
0
|
![]() 6343 / 3514 / 1427
Регистрация: 07.02.2019
Сообщений: 8,979
|
|
02.07.2019, 14:44 [ТС] | 8 |
Иначе говоря он их просто игнорирует? Но они в действительности куда то же записываются(регистры, стек...), Ничего там важного не потрется? (извиняюсь за глупый вопрос
![]()
0
|
зомбяк
![]() 1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
02.07.2019, 14:48 | 9 |
zayats80888, он не игнорирует, он смотрит на объявление
void right(int a, int b) , а не на число указанных плейсхолдеров. Задашь там void right() и всё сломается.
0
|
![]() 6343 / 3514 / 1427
Регистрация: 07.02.2019
Сообщений: 8,979
|
|
02.07.2019, 14:53 [ТС] | 10 |
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
02.07.2019, 15:02 | 11 |
Нет не игнорирует. Здесь будет что-то типа std::invoke(C::right, this /*это параметры сохранённые в bind*/, a, b /*это параметры вызывающей функции*/).
Игнорирует, когда есть плейсхолдеры. Хотя, что-то я загнал не то
0
|
![]() 1660 / 489 / 106
Регистрация: 17.05.2015
Сообщений: 1,500
|
||||||
02.07.2019, 15:05 | 12 | |||||
![]() Решение
Рассмотрим код:
Здесь нет ни UB, ни ошибки. Такое поведение - стандартно.
1
|
![]() 6343 / 3514 / 1427
Регистрация: 07.02.2019
Сообщений: 8,979
|
|
02.07.2019, 15:12 [ТС] | 13 |
eva2326, спасибо. Только тот факт, что std::function проглотил то, что я не планировал, меня озадачил
![]()
0
|
|
![]() |
Новые блоги и статьи
![]() |
||||
Лучшие практики оптимизации Docker Image
Mr. Docker 13.03.2025
Размер Docker-образа влияет на множество аспектов работы с контейнерами. Чем больше образ, тем дольше его загрузка в реестр и выгрузка из него. Для команд разработки, работающих с CI/ CD пайплайнами,. . .
|
Вопросы на собеседовании по Docker
Mr. Docker 13.03.2025
Ты сидишь напротив технического специалиста, и вдруг звучит вопрос про Docker Swarm или многоэтапные сборки. Пот на лбу? Не переживай, после этой статьи ты будешь готов ко всему! Эта статья будет. . .
|
Поиск текста в сносках : замена дефиса на тире или тире на дефис...
РоΜа 13.03.2025
Нужно было найти текст в сносках и заменить. Почему-то метод селекшн не сработал. . . пришлось гуглить. найденный на форумвба код пришлось править. Смысл - заменяет в сносках дефисы и тире на нужные. . . .
|
Real PATH definitions in bash scripts
jigi33 13.03.2025
Как поймать путь и путь к директории относительно запускаемого файла в BASH
1. поймать путь через вывод $(pwd)
2. более правильно - на основе realpath (см. скриншот)
|
Django или Flask: что выбрать для веб-разработки на Python
py-thonny 13.03.2025
Django – это высокоуровневый фреймворк, который придерживается философии "всё включено". Он предоставляет разработчику готовые решения для большинства типичных задач веб-разработки: от аутентификации. . .
|
Непрерывное развертывание в Java с Kubernetes
Javaican 13.03.2025
Чем так привлекателен Kubernetes для развертывания Java-приложений? Этот оркестратор контейнеров позволяет автоматизировать развертывание, масштабирование и управление контейнеризированными. . .
|
Предотвращение XSS, CSRF и SQL-инъекций в JavaScript
run.dev 13.03.2025
JavaScript занимает первые позиции среди языков веб-разработки, но его распространенность делает его привлекательной целью для злоумышленников. Межсайтовый скриптинг (XSS), межсайтовая подделка. . .
|
PHP 8: JIT-компиляция и улучшение производительности
Jason-Webb 13.03.2025
PHP никогда не славился своей скоростью. Многие сталкивались с проблемами производительности при работе со сложными вычислениями или обработкой больших объемов данных. Традиционная модель выполнения. . .
|
Сериализация данных с Apache Avro в Kafka
Javaican 12.03.2025
Apache Kafka стала одним из ключевых решений для работы с большими потоками данных. Однако с ростом объемов передаваемых данных возникает проблема: как эффективно сериализовать и десериализовать. . .
|
Создание потребителей Kafka с помощью Reactor Kafka
Javaican 12.03.2025
Reactor Kafka — это библиотека, объединяющая Apache Kafka с реактивным программированием на базе Project Reactor. Такое сочетание позволяет строить неблокирующие, асинхронные приложения с контролем. . .
|