带有lambda谓词和auto元素的std::remove_if是否可行
Is std::remove_if with lambda predicate and auto element possible?
我认为这是不可能的,因为我得到了以下错误:
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());
现在,如果你改为写这个,一切都很好,它会擦除值为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());
那么,你能简单地不使用auto
作为函数参数吗?
这是因为auto
的类型是由右值决定的吗?尽管它是在int
的已知向量上执行的算法的谓词,但编译器无法推导出该右值?
有人知道原因吗?
遗憾的是,虽然这是在C++0x过程中提出的,但最终没有实现。对于简单的函子,你可能想使用Boost.Lambda(可能也是Phoenix v3),其中生成的函子是多态的(因此你不需要指定任何内容):
std::remove_if(myVec.begin(), myVec.end(),
_1 == 3)
仅具有类型推断的解决方案:
// uses pass-by-reference unlike the question
std::remove_if(myVec.begin(), myVec.end(),
[](decltype(myVec[0]) i){return i==3;})
auto
是一种基于初始化值的类型推断。参数在代码中出现的位置不会初始化为任何值。
基本上,这已经被建议,然后被拒绝,然后添加了lambdas,所以它几乎成功了,但碰巧没有成功,而且很可能在未来成为语言。
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 使用函数"remove"删除重复元素
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 链表的泛型函数remove()与成员函数remove)
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 使用if-else将数字转换为单词
- 为什么简单的算术减法在"if"条件下不起作用?