Что же всё-таки может заинлайнить компилятор при включенной оптимизации (по умолчанию, /O2)
template<typename F>
void proceed( std::vector<int>& mv, F f)
{
//просто для проверки
std::transform(mv.begin(), mv.end(), mv.begin(), f);
}
inline double selector(int x)
{
return cos(x);
}
int main(int argc, char* argv[] )
{
std::vector<int> a(10);
for (int i = 0; i < 10; ++ i) a[i] = i;
srand(time(0));
int dummy=rand();
proceed(a, &selector);
proceed(a, [](int x) { return cos(x); });
proceed(a, [=](int x) { return dummy*cos(x); });
proceed(a, std::bind(&selector, std::placeholders::_1));
return 0;
}
У меня (msvc2012):
1) вызов через указатель, инлайнится
2) вызов лямбды, так как stateless то преобразуется к указателю, инлайнится
3) вызов лямбды, statefull, всё равно инлайнится
4) результат вызова std::bind. Не может. Или всё таки может?
UPD Вопросы не применительно к msvc, а вообще