Здравствуйте, nen777w, Вы писали:
N>Я поражаюсь С++ — офигенный язык, с такими классными возможностями, тут каждый найдёт себе что хочет. N>Одни например goto боятся другие макросов...
Здравствуйте, B0FEE664, Вы писали:
A>>я бы сказал что С++11 больше двух лет, а вы какой-то фигней занимаетесь.
BFE>Ну вот. Мы перешли на новый стандарт.
Здравствуйте, Abyx, Вы писали:
A>я уже писал ниже, A>
A>auto a = std::move(pList->front());
A>pList->pop_front();
A>a.f();
A>
Это вариант. Но меня больше интересует at_scope_exit.
A>но если у тебя тип не перемещаемый, то тебе нужен unique_ptr, он легче чем shared_ptr и семантически правильней A>
A>std::unique_ptr<std::list<A>, void(*)(std::list<A>* p)> remover(pList.get(), [](std::list<A>* p){ p->pop_front(); });
A>
Это какой-то ужас: три раза по "std::list<A>"! Нет уж, слишком длинно.
A>или можно взять/написать какой-нибудь at_scope_exit
Ну я вот подумал и вижу два варианта, но в коде не уверен, так как не писал ещё такого:
N>>Я поражаюсь С++ — офигенный язык, с такими классными возможностями, тут каждый найдёт себе что хочет. N>>Одни например goto боятся другие макросов...
BFE>Я их не боюсь. Я их ненавижу.
"Страх рождает гнев, гнев рождает ненависть."(С) не помню кто
Здравствуйте, nen777w, Вы писали:
N>>>Я поражаюсь С++ — офигенный язык, с такими классными возможностями, тут каждый найдёт себе что хочет. N>>>Одни например goto боятся другие макросов... BFE>>Я их не боюсь. Я их ненавижу. N>"Страх рождает гнев, гнев рождает ненависть."(С) не помню кто
Здравствуйте, B0FEE664, Вы писали:
N>>>>Я поражаюсь С++ — офигенный язык, с такими классными возможностями, тут каждый найдёт себе что хочет. N>>>>Одни например goto боятся другие макросов... BFE>>>Я их не боюсь. Я их ненавижу. N>>"Страх рождает гнев, гнев рождает ненависть."(С) не помню кто BFE>Зачем макросы если вот здесь
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, Abyx, Вы писали:
A>>можно же просто хранить ссылку, а она продлит время жизни лямбды A>>http://coliru.stacked-crooked.com/a/cf93a63c93859758 BFE>ой ли? BFE>Почему вывод не 42, а непонятное 1?
BFE>
Не, продлевается только время жизни результата выражения — http://coliru.stacked-crooked.com/a/1f4d6e661b5b1eab
В этом кстати засада с expression templates, то есть биндить их к auto&& нужно с осторожностью, а то данные на которые они ссылаются могут разрушиться к моменту вычисления.
Здравствуйте, B0FEE664, Вы писали:
BFE>>Зачем здесь амперсанды? EP>>> auto &&guard = aux * [] EP>>> { EP>>> cout << "end of scope" << endl; EP>>> }; BFE>PS Наверно, чтобы избежать копирования...
Да, это продлевает время жизни оригинального временного объекта до конца scope (также как и const &x = foo(); в предыдущих стандартах).
Помимо этого там используется copy-list-initialization — return { x };, в результате чего Guard может быть полностью non-copyable и non-movable (то есть не будет ни копий, ни перемещений, ни всяких copy/move elision).
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Да, это продлевает время жизни оригинального временного объекта до конца scope (также как и const &x = foo(); в предыдущих стандартах). EP>Помимо этого там используется copy-list-initialization — return { x };, в результате чего Guard может быть полностью non-copyable и non-movable (то есть не будет ни копий, ни перемещений, ни всяких copy/move elision).
С Guard более-менее понятно, а вот одно копирование лямбды будет так или иначе(в момент создания Guard). Видимо надо завести ещё один Guard для указателя на функтор...
Кстати, зачем std::decay_t<F> ? Почему не typename std::decay<F>::type ? В этом есть какой-то сакральный смысл?
PS Тем, кто досюда дочитал, шутка дня:
What is std::decay and when it should be used?
It's obviously used to decay radioactive std::atomic types into non-radioactive ones.
Здравствуйте, B0FEE664, Вы писали:
BFE>С Guard более-менее понятно, а вот одно копирование лямбды будет так или иначе(в момент создания Guard).
Там будет одно перемещение.
BFE>Видимо надо завести ещё один Guard для указателя на функтор...
Вот так?
{
auto lambda = []
{
cout << "end of scope" << endl;
};
auto &&guard = make_guard(lambda); // takes reference to lambda
cout << "begin of scope" << endl;
}
Думаю одно перемещение не настолько страшно, тем более после инлайнинга оно скорей всего испарится.
Да и теряется возможно обернуть всё это в удобный макрос:
{
scope_exit
{
cout << "end of scope" << endl;
};
cout << "begin of scope" << endl;
}
BFE>Кстати, зачем std::decay_t<F> ? Почему не typename std::decay<F>::type ?
Как уже выше сказали — меньше букв.
BFE>В этом есть какой-то сакральный смысл?
Это был такой тонкий намёк на то что на дворе уже C++14