Ivan
ага, я тоже хотел этого когда-то
Constantine
я хочу, чтобы изначально помеченную как однократно вызываемую функцию нельзя было врапить в контейнер, который для многократно вызываемых
Anatoliy
можешь использовать clang tools чтобы найти паттерн в AST
Constantine
я могу С++ компилятор свой написать еще
Anatoliy
там где-то даже что-то готовое есть
Constantine
и назвать Rust++
Constantine
а все потому
Ivan
я кстати писал свой препроцессор, используй его
Constantine
что лень протрансферить один параметр
Anatoliy
нет. есть специальные статические анализаторы прямо для этих целей. более того там есть такая опция прям для твоей задачи. недавно в llvm рассылке было
Constantine
это замечательно
Constantine
сообщите, когда clang заменит two-phase name lookup
Constantine
на msvc-like name lookup
Anatoliy
скорей всего там это делается каким-то одним флагом
Constantine
Constantine
Anatoliy
удачи
а как ты ещё хочешь нестандартное поведение включать? силой мысли?
Constantine
по нормальному в msvc
Constantine
Constantine
простые флаги не делают msvc-like name lookup
Anatoliy
что функция должна сделать, если ты её второй раз вызываешь?
Constantine
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
Ivan
блин, я всё правильно написал, изначально
Constantine
и скажи, где у тебя синтаксическая проверка
Constantine
я не хочу, чтобы у меня программа падала
Constantine
я хочу, чтобы одноразовые конструкторы нельзя было пихать туда, где требуются многоразовые
Anatoliy
я уже показал тебе, что ты хочешь перенести на компайлтайм принципиально рантаймовскую вещь. это невозможно
Constantine
и хочу, чтобы в периодический таймер не пихалась одноразовая функция
Constantine
Anatoliy
у тебя логическая несостыковка
Anatoliy
ты понять только не можешь
Constantine
достаточно просто написать &&
Constantine
в operator ()
Constantine
для класса лямбды
Anatoliy
это как хотеть доступаться по рантаймовскому индексу к элементам std::tuple
Constantine
и в периодический таймер эта лямбда НЕ ЗАПИХАЕТСЯ
Anatoliy
в этом случае тебе просто нужен std::vector
Anatoliy
скорей всего
Constantine
а ты мне говоришь
Constantine
что
void f(T&)
и
void f(T&&)
это одно и то же
Cuno
Anatoliy
Constantine
потому что все равно компилятор не проверяет два перемещения
Constantine
и что надо писать
auto f(std::unique_ptr<T>& t) {
return std::move(t);
}
Anatoliy
я продемонстрировал, что ты можешь и саму лямбду перемещать туда-сюда
Constantine
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
Constantine
mutable не пишешь получаешь
Alexander "SonnySlave"
MAX_FUNCTION_CALL дефайн!
Alexander "SonnySlave"
Implementation-defined, все дела
Constantine
есть разница между 1 и много, ну не передергивай