为什么copy_if实现不将unary_predicate作为const引用参数

问题描述 投票:0回答:1
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 引用?

c++11
1个回答
0
投票

让我们看看如果

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
失败的一个简单用例。

为什么“标准”会限制“标准功能”的灵活性?

© www.soinside.com 2019 - 2024. All rights reserved.