为什么我不能绑定?

Why Can't I constexpr a bind?

本文关键字:绑定 不能 为什么      更新时间:2023-10-16

所以说我想制作一些constexpr函子,虽然我可以使用bind来做到这一点。我错过了什么吗?为什么bind不能返回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));

我能做些什么来做到这一点吗?

制作 constexprbind没有技术障碍;例如,Sprout C++ Libraries 有一个启用 constexpr 的绑定。

但是,在标准中未指定的情况下,不允许实现将constexpr添加到函数签名中,并且尚未有任何建议将constexpr添加到我知道的bind中(C++14标准库的哪些部分可能是,哪些部分将被制作为constexpr?这是相当不可能的,因为bind大多被lambda表达式取代,截至C++17,lambda表达式自动成为constexpr:

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

好吧,我们不知道std::bind返回什么。 它可能被赋予工作,但没有强制要求它工作(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(); };

现场示例