为什么我不能构造一个绑定?

Why Can't I constexpr a bind?

所以说我想制作一些 constexpr 仿函数,虽然我可以使用 bind 来做到这一点。有什么我想念的吗?为什么不能 bind return constexpr?

鉴于:

struct foo {
    int b() const { return _b; }
    int a() const { return _a; }
    int r() const { return _r; }
    const int _b;
    const int _a;
    const int _r;
};

我想:

constexpr auto sumB = bind(plus<int>(), placeholders::_1, bind(&foo::b, placeholders::_2));
constexpr auto sumA = bind(plus<int>(), placeholders::_1, bind(&foo::a, placeholders::_2));
constexpr auto sumR = bind(plus<int>(), placeholders::_1, bind(&foo::r, placeholders::_2));

我可以做些什么来完成这项工作吗?

好吧,我们不知道什么 std::bind returns。它可能可以工作,但没有任何强制要求使其工作(在 std::bind 的规范中没有定义为 constexpr)。

不过,如果您可以访问 C++17,您可以做的一件事是使用 lambda。在 C++17 中,lambda 的 operator() 将默认标记为 constexpr,允许您执行类似

的操作
constexpr auto sumB = [](auto val, auto obj) { return val + obj.b(); };
constexpr auto sumA = [](auto val, auto obj) { return val + obj.a(); };
constexpr auto sumR = [](auto val, auto obj) { return val + obj.r(); };

Live Example

制作bindconstexpr没有技术障碍;例如,Sprout C++ Libraries have a constexpr-enabled bind.

但是,implementations are not permitted to add constexpr to function signatures where it is not specified in the Standard, and there has not yet been any proposal to add constexpr to bind that I am aware of (Which parts of the C++14 Standard Library could be and which parts will be made constexpr?). It is fairly unlikely that one would be forthcoming, since bind is mostly superseded 通过 lambda 表达式,从 C++17 开始自动 constexpr:

constexpr auto sumB = [](int x, foo const& y) { return x + y.b(); };