std::bind 以局部变量作为值

std::bind to local variable as a value

绑定到作为局部变量的值是一种好习惯吗:

bool func(const std::string& a, const std::string& b)
{
    return a + "abc" == b;
}

…………

auto str = getRandomString();
auto it = std::find_if(
    vec.begin(), 
    vec.end(), 
    std::bind(func, str, std::placeholders::_1));

As std::bind return value 是一个函数对象,它为每个局部变量创建一个新的函数对象?我应该改用 lambda 表达式吗?

auto it = std::find_if(
    vec.begin(), 
    vec.end(), 
    [str](const std::string& b){return str + "abc" == b;});

你应该几乎总是更喜欢使用 lambda 而不是 std::bind。首先,它不会像 std::bind 那样存在潜在的歧义;例如:

void foo(int a, std::string b);
void foo(Object a, std::string b);

std::bind(foo, std::placeholders::_1, some_string); // Which function is this binding?

(是的,你可以解决这个问题,但它真的很难看,需要显式转换)。

其次,lambda 版本可能会更快:最终它归结为普通函数调用(可以内联)。 std::bind 通常使用另一层间接(基本上是内部函数指针)来阻碍内联。

最后,您可以明确告诉 lambda 应该如何存储其闭包变量(通过引用或通过值)。这也可以用 std::bind 来完成,但通常更难看,需要 std::crefstd::ref 包装器。

两者都创建了一个包含 str.

副本的函数对象

lambda稍微好一点,因为函数是成员函数,可以直接调用。 bind 存储一个函数指针,它可能需要存储,并且可能必须间接调用,具体取决于优化器的性能。