Безопасно ли помещать лямбды в список статических инициализаторов и захватывать по ссылке?

void func(const std::string& args)
{

// Statically initialize a vector of lambdas (only one here for now)
// The lambdas capture by reference with[&], but since the
// initializer list is static (and thus initialized only once), how
// will the lambda be able to access args with each successive call to func()?
// Won't there be undefined behavior with this?
static std::vector<std::function<void()>> FuncMap =
{

// args (and everything else in scope) will be captured by reference
{ [&]() { for(const auto& s: args) std::cout << s << std::endl; }}

};

auto f = FuncMap[0];

f();
}

3

Решение

Я не знаю, если вы спрашиваете это из любопытства, или вы действительно пытаетесь сделать что-то подобное. Если последнее, вот возможное решение:

void func(const std::string& args)
{
static std::string const * pargs;
static std::vector<std::function<void()>> FuncMap =
{
{ [&]() { for(const auto& s: *pargs) std::cout << s << std::endl; }}
};

pargs = &args;
auto f = FuncMap[0];

f();
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]