Я гуглил эту тему, связанную с функтором, и кажется, что люди обычно говорят, что стандартная библиотека по умолчанию возьмет функтор в качестве копии.Было найдено много примеров, и это верно для std::for_each
.Компиляторы GCC и VC2008 дали один и тот же результат: оба берут копию функтора.
Но для std::transform
я обнаружил разницу в коде тестирования ниже:
#include <iostream>
#include <vector>
using namespace std;
#define MSG(msg) cout << msg << endl;
struct MyFunctor{
MyFunctor()
{
MSG("MyFunctor constructor");
}
MyFunctor(const MyFunctor& myf)
{
MSG("MyFunctor copy constructor");
}
~MyFunctor()
{
MSG("MyFunctor destructor");
}
int operator()(int i)
{
i = -(i+1);
return i;
}
};
int main()
{
vector<int> myvec;
myvec.push_back(1);
myvec.push_back(1);
myvec.push_back(1);
myvec.push_back(1);
std::transform(myvec.begin(),myvec.end(),myvec.begin(),MyFunctor());
system("pause");
}
/*
gcc result:
MyFunctor constructor
MyFunctor destructor
vc2008 result:
MyFunctor constructor
MyFunctor copy constructor
MyFunctor copy constructor
MyFunctor destructor
MyFunctor destructor
MyFunctor destructor
*/
Результаты, по-видимому, говорят о том, что GCC использует MyFunctor
в качестве ссылки, а vc2008 - как копию (так же, как они оба обрабатывают for_each
).
Почему GCC и vc2008 ведут себя по-разному в этом вопросе, и какая из них должна быть правильной практикой?