Гарантировать инлайнинг самовызывающейся лямблы
Представим, что в коде по какой-то причине есть такой фрагмент:
[&](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 шт):
Нельзя быть уверенным. Инлайнить или нет не оговорено стандартом, а значит компилятор не обязан этого делать. Ключевое слово inline никак влияет на это.
Если заменить auto на auto&&, то теоретически с помощью универсальной ссылки компилятору легче понять, что происходит. Но опять таки никаких гарантий на инлайн нет.