std :: bind到本地变量作为值

Nar*_*rek 1 c++ lambda bind std

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

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

......

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

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

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

Yuu*_*shi 5

与使用相比,您几乎总是应该更喜欢使用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?
Run Code Online (Sandbox Code Playgroud)

(是的,您可以解决此问题,但这确实很丑陋,需要显式强制转换)。

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

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