template<class InputIt, class OutputIt, class UnaryPred>
OutputIt copy_if(InputIt first, InputIt last,
OutputIt d_first, UnaryPred pred)
{
for (; first != last; ++first)
if (pred(*first))
{
*d_first = *first;
++d_first;
}
return d_first;
}
上面是来自 cppreference 的 copy_if 的示例实现。我的问题是为什么第三个参数不是 const 引用?
让我们看看如果
pred
是 const&
我们会得到什么
copy_if
是一个标准函数,我希望它能够与我的谓词一起使用,该谓词具有要更新的内部状态。这是我的谓词,我就是这样写的。
#include <vector>
#include <iostream>
/* Custom copy_if implementation using const& */
template <typename InputIt, typename OutputIt, typename UnaryPred>
OutputIt copy_if_const_ref(InputIt first, InputIt last, OutputIt d_first, const UnaryPred& pred) {
for (; first != last; ++first) {
if (pred(*first)) { /* error: no match for call to '(const main()::<lambda(int)>) (int&)' */
*d_first++ = *first;
}
}
return d_first;
}
int main() {
std::vector<int> n1 = {1, 2, 3, 4, 5, 6};
std::vector<int> n2;
int count = 0;
/* Mutable lambda that modifies a captured state because i simply want to do this */
auto pred = [=](int x) mutable {
++count;
return x % 2 == 0;
};
/* This will fail to compile because the lambda cannot modify its state */
copy_if_const_ref(n1.begin(), n1.end(), std::back_inserter(n2), pred);
return 0;
}
修复此代码就像将谓词修改为一样简单
auto pred = [/* = */](int x) mutable {
/* ++count; */
return x % 2 == 0;
};
谓词不是
const&
的原因列表还在继续,这只是我的 copy_if_const_ref
失败的一个简单用例。
为什么“标准”会限制“标准功能”的灵活性?