C++ std::remove_if是否可以使用lambda谓词和auto元素?

C++ std::remove_if是否可以使用lambda谓词和auto元素?,c++,stl,lambda,c++11,C++,Stl,Lambda,C++11,我假设这是不可能的,因为我得到了以下错误: error C3533: 'auto': a parameter cannot have a type that contains 'auto' 下面是重现错误的代码片段: int myInts[] = {1,2,3,3,3,4}; std::vector<int> myVec(myInts, myInts + sizeof(myInts)/sizeof(int)); myVec.erase( std::remove_if(myV

我假设这是不可能的,因为我得到了以下错误:

error C3533: 'auto': a parameter cannot have a type that contains 'auto'
下面是重现错误的代码片段:

int myInts[] = {1,2,3,3,3,4};
std::vector<int> myVec(myInts, myInts + sizeof(myInts)/sizeof(int));
myVec.erase(
    std::remove_if(myVec.begin(), myVec.end(),
        [](auto i){return i==3;}), // lambda param error
    myVec.end());
int myInts[]={1,2,3,3,4};
向量myVec(myInts,myInts+sizeof(myInts)/sizeof(int));
myVec.erase(
std::remove_if(myVec.begin(),myVec.end(),
[](自动i){return i==3;}),//lambda参数错误
myVec.end());
现在,如果你写这个,一切都很好,它将删除值为3的元素:

int myInts[] = {1,2,3,3,3,4};
std::vector<int> myVec(myInts, myInts + sizeof(myInts)/sizeof(int));
myVec.erase(
    std::remove_if(myVec.begin(), myVec.end(),
        [](int i){return i==3;}),
    myVec.end());
int myInts[]={1,2,3,3,4};
向量myVec(myInts,myInts+sizeof(myInts)/sizeof(int));
myVec.erase(
std::remove_if(myVec.begin(),myVec.end(),
[](int i){return i==3;}),
myVec.end());
因此,您可以简单地不使用
auto
作为错误提示的函数参数吗

这是因为
auto
的类型是由右值决定的,尽管右值是在已知向量
int
上执行的算法的谓词,但编译器无法推断右值


有人知道原因吗?

一个
auto
是一个基于您将其初始化为的值的类型推断。一个参数在代码中出现的地方没有初始化成任何东西。

遗憾的是,虽然这是在C++0x过程中提出的,但它最终从未出现过。对于简单的函子,您可能希望使用类似Boost.Lambda的东西(当它出现时也可能是Phoenix v3),其中生成的函子是多态的(因此您不需要指定任何内容):


仅具有类型推断的解决方案:

// uses pass-by-reference unlike the question
std::remove_if(myVec.begin(), myVec.end(),
    [](decltype(myVec[0]) i){return i==3;})

基本上,这已经被提出,然后被拒绝,然后加入了Lambda,所以它几乎成功了,但碰巧没有,在函数中默认一个
auto
参数的值时,我也会遇到同样的错误,所以我想这还不够,但这是意料之中的。最后我听说Boost.Phoenix v3是Boost.Lambda(最终是Boost.Bind)的正式替代品,因此,考虑到Boost.Lambda没有未来,最好从Phoenix v2(或等待v3)开始,完全忽略Boost.Lambda.nifty,我们使用boost,所以这是一个选项,但我最近一直在尝试熟悉C++0x功能。@AJG86没有允许动态创建多态函子的C++0x功能——尽管您的特定问题只需要解决类型推断,而不需要完全了解多态性Herb Sutter最近在第9频道谈到了这一点。如果我能在不缓冲lol的情况下让它超过4秒,那可能会非常有趣。下载链接在右边。在C++14中,引入了通用lambda(,),它允许使用
auto
。任何对历史性讨论的参考都会非常好。知道在哪里可以找到一些档案吗?
// uses pass-by-reference unlike the question
std::remove_if(myVec.begin(), myVec.end(),
    [](decltype(myVec[0]) i){return i==3;})