使用 lambda 初始化的 C++ 静态成员

C++ static members initialized with lambda

以下是合法的:

class FooAccesor {
  static std::function<void(Foo& foo)> getFooMethod() {
    return []() { foo.method(); };
  }
}

class FooAccesor {
  static const std::function<void(Foo& foo)> fooMethod = []() { foo.method(); };
}

不是。 (尝试用 constexpr 修复但无济于事。)我的 MSVC 编译器解释说 member of type const std::function<void(Foo& foo)> cannot have in-class initializer。所以我必须做类似

的事情
class FooAccesor {
  static std::function<void(Foo& foo)> fooMethod;
}
std::function<void(Foo& foo)> fooMethod = []() { foo.method(); };

我的问题是:为什么允许我有效地初始化一个方法,而(据我所知)不允许我初始化静态数据成员?

您可以将成员声明为 inline (C++17 起)。并且您必须修复示例中的几个拼写错误(缺少 ; 并且没有将 Foo 传递给 lambda):

#include <functional>

struct Foo { void method(){}};

class FooAccesor {
  inline static std::function<void(Foo& foo)> fooMethod = [](Foo& foo) { foo.method(); };
};