Ivan
ага, я тоже хотел этого когда-то
Constantine
я хочу, чтобы изначально помеченную как однократно вызываемую функцию нельзя было врапить в контейнер, который для многократно вызываемых
Anatoliy
можешь использовать clang tools чтобы найти паттерн в AST
Constantine
я могу С++ компилятор свой написать еще
Anatoliy
там где-то даже что-то готовое есть
Constantine
и назвать Rust++
Constantine
а все потому
Ivan
я кстати писал свой препроцессор, используй его
Constantine
что лень протрансферить один параметр
Anatoliy
нет. есть специальные статические анализаторы прямо для этих целей. более того там есть такая опция прям для твоей задачи. недавно в llvm рассылке было
Constantine
это замечательно
Constantine
сообщите, когда clang заменит two-phase name lookup
Anatoliy
что лень протрансферить один параметр
вручную? а это не подвержено ошибкам?
Constantine
на msvc-like name lookup
Anatoliy
скорей всего там это делается каким-то одним флагом
Constantine
вручную? а это не подвержено ошибкам?
ну не знаю, возможно, разработчики компиляторов не смогут применить ref-qualifier на лямбду без ошибок
Ivan
я хочу, чтобы изначально помеченную как однократно вызываемую функцию нельзя было врапить в контейнер, который для многократно вызываемых
я конечно, не очень понимаю что там тебе надо, но может если функция однократно вызываема, не делать её в виде функции а прям в коде написать тело?
Anatoliy
удачи
а как ты ещё хочешь нестандартное поведение включать? силой мысли?
Constantine
по нормальному в msvc
Constantine
простые флаги не делают msvc-like name lookup
Anatoliy
что функция должна сделать, если ты её второй раз вызываешь?
Constantine
в действительности скорее всего std::bad_function_call
Ivan
ааа, ты не хочешь чтобы в контейнер клали ещё раз эту функцию?
Constantine
разумеется once callable function просто по определению НЕ CopyConstructible
Constantine
зачем копировать то, что можно использовать только один раз
Anatoliy
вот тебе решение: auto l = [x = std::move(x)] () mutable -> auto { return *std::exchange(x, nullptr); }; благодарности не надо
Anatoliy
будет падать
Anatoliy
как ты и хотел
Constantine
вот тебе решение: auto l = [x = std::move(x)] () mutable -> auto { return *std::exchange(x, nullptr); }; благодарности не надо
а теперь напиши мне врапперы для once_callable_function и для mc_multiple_callable_function
Ivan
блин, я всё правильно написал, изначально
Constantine
и скажи, где у тебя синтаксическая проверка
Constantine
я не хочу, чтобы у меня программа падала
Constantine
я хочу, чтобы одноразовые конструкторы нельзя было пихать туда, где требуются многоразовые
Anatoliy
я уже показал тебе, что ты хочешь перенести на компайлтайм принципиально рантаймовскую вещь. это невозможно
Constantine
и хочу, чтобы в периодический таймер не пихалась одноразовая функция
Anatoliy
у тебя логическая несостыковка
Anatoliy
ты понять только не можешь
Constantine
достаточно просто написать &&
Constantine
в operator ()
Constantine
для класса лямбды
Anatoliy
это как хотеть доступаться по рантаймовскому индексу к элементам std::tuple
Constantine
и в периодический таймер эта лямбда НЕ ЗАПИХАЕТСЯ
Anatoliy
в этом случае тебе просто нужен std::vector
Anatoliy
скорей всего
Constantine
а ты мне говоришь
Constantine
что void f(T&) и void f(T&&) это одно и то же
Constantine
что void f(T&) и void f(T&&) это одно и то же
и нет смысла писать void f(std::unique_ptr<T>&&)
Constantine
потому что все равно компилятор не проверяет два перемещения
Cuno
автоматически - нет
Автоматически, на типах.
Constantine
и что надо писать auto f(std::unique_ptr<T>& t) { return std::move(t); }
Anatoliy
я продемонстрировал, что ты можешь и саму лямбду перемещать туда-сюда
Constantine
только вызывать я должен ее в этом случае с перемещением
Constantine
на самом деле через вспомогательный блекхол
Constantine
и вместо UB я уже получил, std::bad_function_call бесплатно без регистрации и смс
Anatoliy
нет. не разумеется. не-mutable лямбду захватившую move-only объект не можешь
Constantine
разумеется я буду писать mutable&&
Constantine
потому что типа const&& в плюсах на самом деле нет
Constantine
можно забыть про него
Constantine
все равно он конвертится в const&
Anatoliy
есть
Constantine
ну давай
Anatoliy
даже перегрузку в 14 ввели для std::get
Constantine
круто
Constantine
жаль бесполезно
Constantine
потому что const&
Constantine
допустимый тип временного const объекта
Anatoliy
member function ref qualifier const && имеет смысл
Constantine
mutable не пишешь получаешь
Alexander "SonnySlave"
MAX_FUNCTION_CALL дефайн!
Alexander "SonnySlave"
Implementation-defined, все дела
Constantine
есть разница между 1 и много, ну не передергивай