为什么我不能constexpr绑定?

时间:2017-07-28 14:21:59

标签: c++ c++11 bind functor constexpr

所以说我想制作一些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));

我能做些什么来使这项工作?

2 个答案:

答案 0 :(得分:5)

制作bind constexpr没有技术障碍;例如,Sprout C++ Libraries有一个constexpr-enabled bind

但是,implementations are not permitted to add constexpr to function signatures where it is not specified in the Standard,还没有任何建议将constexpr添加到我知道的bindWhich parts of the C++14 Standard Library could be and which parts will be made constexpr?)。由于bindmostly superseded的lambda表达式,因此从C ++ 17开始是自动constexpr:

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

答案 1 :(得分:3)

好吧,我们不知道std::bind会返回什么。它可能会起作用,但没有强制要求它起作用(在constexpr的规范中没有任何内容被定义为std::bind

关于你可以做的事情,如果你有权使用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