Является ли приведенный ниже код стандартным? (богболт)
т.е. by-ref захватывает ссылку пересылки, представляющую временную, и возвращает результирующее лямбда-значение из функции в том же выражении.
Конечно, сохранение лямбды для последующего использования приведет к тому, что она будет содержать висячую ссылку, но я имею в виду точное использование внутри main
.
Сомнения, которые у меня возникают, связаны с этим ответом SO и потенциально это языковой дефект. В частности, есть один пугающий комментарий, в котором говорится: "правило срока действия захвата ссылок в стандартных ссылках относится к захваченным переменным, а не к данным и их области действия". мой код.
#include <stdlib.h>
#include <string.h>
#include <cassert>
template<typename F>
auto invoke(F&& f)
{
return f();
}
template<typename F>
auto wrap(F&& f)
{
return [&f]() {return f();}; // <- this by-ref capture here
}
int main()
{
int t = invoke(wrap(
[]() {return 17;}
));
assert(t == 17);
return t;
}
return f();
, конечно. - person Hatted Rooster   schedule 07.04.2019invoke
иwrap
не распространяются, верно? Вы также можете передавать ссылки lvalue. - person Richard Hodges   schedule 07.04.2019wrap
, конечно, что-то делает - person haelix   schedule 07.04.2019invoke
для получения ссылки на l-значение, но это не изменит вопроса - функцияinvoke
просто служит способом использования лямбда-выражения, возвращаемого изwrap
, внутри того же выражения - person haelix   schedule 07.04.2019