c – 是否可以使用lambda谓词和auto元素的std :: remove_if?

前端之家收集整理的这篇文章主要介绍了c – 是否可以使用lambda谓词和auto元素的std :: remove_if?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我假设这是不可能的,因为我收到以下错误
error C3533: 'auto': a parameter cannot have a type that contains 'auto'

这是重现错误代码片段:

int myInts[] = {1,2,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());

现在如果你要写这个而不是一切都很好,它会擦除​​值为3的元素:

int myInts[] = {1,[](int i){return i==3;}),myVec.end());

那么你可以简单地不使用auto作为函数参数,因为错误暗示了吗?

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

有谁知道原因?

解决方法

遗憾的是,虽然这是在C 0x过程中提出的,但最终从未进入过.对于简单的仿函数,你可能想要使用类似Boost.Lambda(也许是Phoenix v3,当它出来时),其中生成的仿函数是多态的(因此你不需要指定任何东西):
std::remove_if(myVec.begin(),_1 == 3)

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

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

猜你在找的C&C++相关文章