std::function std::bind 具有 lambda 重载歧义

std::function std::bind with lambda overload ambiguity

考虑以下代码

class my_class {
public:
struct my_struct {
   int i;
};
std::function<void(my_struct&)> func;
my_class() {
   func = std::bind([this](my_struct& s) { s.i = 5; });
}
};

在 VS 2017 上,我收到以下错误:

error C2440: 'initializing': 无法从 'std::_Binder>' 转换为 'std::function' 注意:没有构造函数可以采用源类型,或者构造函数重载解析不明确

关于我缺少什么来解决歧义有什么想法吗?

std::bind 在 C++11 中或多或少已经过时了。只需使用 lambda 即可。

class my_class
{
public:
  struct my_struct {
    int i;
  };
  my_class()
  : func ([](my_struct& s) { s.i = 5; }) {}
private:
  std::function<void(my_struct&)> func;
};

这是有史以来最无用的编译器错误。问题是你想要

func = std::bind([this](my_struct& s) { s.i = 5; }, std::placeholders::_1);
//                                                  ^^^^^^^^^^^^^^^^^^^^^

std::bind(f) 意思是“给我一个 g 这样 g(/* anything */) 就是 f()

如果你想传递参数,你需要使用占位符。

(我假设您的真实代码做的事情比这更复杂,因为在您显示的代码中不需要 bind 或捕获 this。)