Гарантировать инлайнинг самовызывающейся лямблы

Представим, что в коде по какой-то причине есть такой фрагмент:

[&](auto x){
  someCode(goes(here));
}(abc());

или даже

int val = [&](auto x){
  int y = someCode(goes(here));
  return f() ? g(y) : y;
}(abc());

Можно ли быть уверенным, что компилятор заинлайнит такие фрагменты и сделает из них

{
  auto x = abc();
  someCode(goes(here));
}
int val;
{
  auto x = abc();
  int y = someCode(goes(here));
  val = f() ? g(y) : y;
}

Что если заменить auto x на auto &&x?

Если в этом быть уверенным нельзя, то как сделать, чтобы лямбда или гарантированно заинлайнилась, или код не скомпилировался вообще?

Кстати, у второго фрагмента есть интересный момент - если там будет какой-то сложный тип, то так просто он на объявление и присваивание не делится, но я почти уверен, что компилятор может и такое нахимичить.


Ответы (1 шт):

Автор решения: user394289

Нельзя быть уверенным. Инлайнить или нет не оговорено стандартом, а значит компилятор не обязан этого делать. Ключевое слово inline никак влияет на это.

Если заменить auto на auto&&, то теоретически с помощью универсальной ссылки компилятору легче понять, что происходит. Но опять таки никаких гарантий на инлайн нет.

→ Ссылка