使用 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(); };
};
以下是合法的:
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(); };
};