Pepe 🐸
Anatoliy
Угу, гениальная идиома
std::unique_ptr<int> supasmart_function(std::unique_ptr<int> & ptr) {
return std::move(ptr);
}
Ирония иронией, однако, ты сам не догадался, что так можно. И, когда бы я смотрел примеры чужого кода, ни разу не видел, чтобы кто-то тоже до этого дошёл. А это значит нет понимания что при выводе типа для T в template< typename T > void f(T &&); например для разных категорий значения int: T может быть либо const int &, либо int &, либо int, либо const int, но никак не int &&. Учитывая правила сворачивания ссылок можно вывести эту идиому (а это идиома по всем признакам, можешь даже не иронизировать).
Эдвард
Друзья, кто-нибудь знает, что делает виндовый pe загрузчик с циклическими зависимостями в таблице импорта?
Andrey
обрабатывает неким способом, зависящим от версии операционной системы.
Andrey
приложение загрузиться, но инициализация dll'ек может быть в разных порядках
Эдвард
Nikita
Ирония иронией, однако, ты сам не догадался, что так можно. И, когда бы я смотрел примеры чужого кода, ни разу не видел, чтобы кто-то тоже до этого дошёл. А это значит нет понимания что при выводе типа для T в template< typename T > void f(T &&); например для разных категорий значения int: T может быть либо const int &, либо int &, либо int, либо const int, но никак не int &&. Учитывая правила сворачивания ссылок можно вывести эту идиому (а это идиома по всем признакам, можешь даже не иронизировать).
я надеюсь ты троллишь)
Nikita
потому что при автовыводе параметра шаблона
1. int никогда не будет
2. int&& запросто может быть
Anatoliy
Anatoliy
при выводе типа (это значит, что ты его явно не указываешь при инстанцировании шаблонной функции, если не знал) у тебя не может быть нарушен static_assert(!std::is_rvalue_reference< T >::value) в рассматриваемом выше случае
Anatoliy
я ж говорю, что мало кто в этой теме шарит
Nikita
а зачем тогда нужно правило сжатия T&& && -> T&& ?
Anatoliy
Anatoliy
Nikita
Nikita
век живи век учись
🦥Alex Fails
Ender
Ender
Ещё бывает например, там где base64 НА САМОМ ДЕЛЕ оказывается radix-64
Constantine
Constantine
Ирония иронией, однако, ты сам не догадался, что так можно. И, когда бы я смотрел примеры чужого кода, ни разу не видел, чтобы кто-то тоже до этого дошёл. А это значит нет понимания что при выводе типа для T в template< typename T > void f(T &&); например для разных категорий значения int: T может быть либо const int &, либо int &, либо int, либо const int, но никак не int &&. Учитывая правила сворачивания ссылок можно вывести эту идиому (а это идиома по всем признакам, можешь даже не иронизировать).
https://ideone.com/99LsBL
> Runtime error
я тебе вот про это говорю, я знаю что такое perfect forwarding в C++ и знаю, почему и как оно работает
Anatoliy
не заходит
Anatoliy
Россию похоже от интернета отключили
Constantine
у меня работает все
Constantine
а, хм
Anatoliy
можешь на wandbox.org?
Constantine
работало)))
Constantine
там простой пример
Deleted Account
Anatoliy
это ссанкции
Anatoliy
новый виток
Constantine
примерно такой
auto f() {
auto p = std::make_unique<int>(42);
auto l1 = /*lambda*/;
return wrap(l1);
}
int main() {
assert(*f()() == 42);
}
Deleted Account
новый виток
https://godbolt.org/g/Am2cDU
Anatoliy
пфф). похоже ты не понимаешь как это работает?
Anatoliy
я выше объяснил, что для lvalue у тебя будет lvalue reference
Constantine
похоже ты не понимаешь, как надо форвардить и писать врапперы
Anatoliy
ты ведь передаёшь ссылку
Constantine
ну да, ты написал wrap как view объект
Anatoliy
нет. это умный wrapper
Constantine
нет, это view объект
Constantine
которому забыли написать L && l;
Anatoliy
если передавать невременный объект, он его дополнительно не сохраняет
Constantine
а, ну ок
Anatoliy
а если временный, то конечно он его перемещает себе
Constantine
угу
Anatoliy
dangling reference - это на твоей стороне вина
Constantine
хм... нет
Anatoliy
ну если совсем хочешь красоту, то сделай std::remove_reference_t< L > у поля класса
Constantine
пушо метод называется wrap
Constantine
std::decay_t
Constantine
и все сломается
Anatoliy
точнее не красоту, а кастомное поведение
Constantine
https://godbolt.org/g/Vj6cKb
Constantine
ой мы криво форвардим
Anatoliy
а где форвард?
Constantine
а, нет
Constantine
мы просто по-извращенски форвардим
Anatoliy
а почему ты не хочешь объект со стека переместить вовнутрь моего умного враппера?
Anatoliy
return wrap(l1); -> return wrap(std::move(l1));
Deleted Account
Anatoliy
так по выходу из функции он где должен существовать?
Anatoliy
нигде? ну вот и получаешь что сам написал))
Anatoliy
да. ты властен это сделать
Constantine
Anatoliy
ты хочешь херни, и наверное сам себе противоречишь, но у меня нет желания производить декомпозицию твоих хотелок вплоть до пары отрицающих друг друга твоих утверждений
Constantine
ладно короче, пиши как хочешь
Deleted Account
я бы хотел писать правильно но так и не понял в чём тут счас проблемка
Deleted Account
я бы тоже не хотел && преобразовывать в & нигде и никогда
Constantine
если не хочешь думать, можешь мне не верить, что надо L&& принимать в конструктор wrap
Anatoliy
тебе не охота явно указывать, что ты хочешь сохранить объект внутри? как компилятор сам догадается? телепаты не приехали
Constantine
а не форвардить L& через forward<L>
Anatoliy
https://godbolt.org/g/CP14uu почему ты старую версию используешь? она wrap(wrap()) не принимает
Anatoliy
Anatoliy
я вижу, что ты плохо понимаешь тему категорий значений
Constantine
Constantine
ну не знаю