C++ 为什么有一个局部函子不好?

C++ 为什么有一个局部函子不好?,c++,visual-studio-2010,C++,Visual Studio 2010,例如,如果谓词只使用一次,那么在main函数中声明类doubler有什么错 #include <list> #include <algorithm> #define SIZE 10 int main() { std::list<int> myList; for(int i=0; i<SIZE ;++i) { myList.push_back(i); } class doubler {

例如,如果谓词只使用一次,那么在main函数中声明类doubler有什么错

#include <list>
#include <algorithm>
#define SIZE 10
int main()
{
    std::list<int> myList;
    for(int i=0; i<SIZE ;++i)
    {
        myList.push_back(i);
    }

    class doubler
    {
    public:
        doubler(){}
        int operator()(int a)
        {
            return a + a;
        }

    } pred;

    std::for_each(myList.begin(), myList.end(), pred);
    return 0;
}
#包括
#包括
#定义尺寸10
int main()
{
std::列表myList;

对于(int i=0;i此设置的问题是,至少在C++03中,您不能使用本地函子作为模板参数,因为它没有外部链接。这意味着从技术上讲,上述代码是不合法的。但是,他们正在C++0x中修复此问题,因为这是一个非常愚蠢的限制,而且VS2010具有基本的C++0x支持上面的代码是完全可以的

简而言之,您的问题的答案是,如果您使用的是与C++0x兼容的编译器,那么它没有什么问题,但是如果您使用的是与C++0x兼容的编译器,那么您可能应该避免这样做,以最大限度地提高跨编译器的兼容性。

  • 在C++0x之前是非法的
  • 在C++0x中,有一个更好的解决方案(lambdas/closures)

因此,在任何一种情况下,您都应该使用不同的解决方案。

如果您使用VS2010,您可以直接使用lambda函数。对于每个函数(myList.begin()、myList.end()、[](int val){return val+val;});vs2005也允许这样做,另外,当functor类型为模板时,GCC会给出一个相当隐晦的错误消息:/(我在尝试编译一些使用VS编译的代码时遇到了这种情况)作为替代,可以使用Boost的LocalFunction或类似的本地函子习惯用法,将本地函子调用委托给外部作用域中的对象。其优点是在C++03和C++11中的工作方式完全相同。