为什么我不能绑定?
Why Can't I constexpr a bind?
所以说我想制作一些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(); };
现场示例
相关文章:
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 为什么结构化绑定不支持可变数组?
- 没有类型结构绑定不起作用?
- 为什么右值不能绑定到非常量左值引用,除了写入临时无效的事实?
- 为什么我不能将常量左值引用绑定到返回 T&&&的函数?
- 为什么我不能绑定?
- QtSql:绑定不会改变SQLite的查询
- 为什么我不能在绑定中使用mem_fn函子?
- 对类型 'A *' 的非常量左值引用不能绑定到不相关的类型 'std::shared_ptr<A>' 的值
- 某些内容可以绑定到非常量引用但不能绑定到常量引用的情况
- | 9 |错误:非静态数据成员'matrix :: row'| 9 |错误:数组绑定不是在']']'令牌|之前的整数常数
- 不能将类型的非常量左值引用绑定到类型的右值
- 为什么指向函数的指针不能绑定到左值引用,而函数可以?
- 纹理绑定不起作用 / C++ / OpenGL
- 如果结构化绑定不能是 constexpr,为什么它们可以在 constexpr 函数中使用?
- boost::与boost:asio绑定在一起.boost::绑定不起作用,从示例中复制
- 绑定不是一个值,而是一个函数(获取该函数的值)
- 为什么c++ 17的结构化绑定不使用{}?
- 套接字绑定不会返回 int
- 我该如何使我的分配器可重新绑定?我能做到这一点,同时保持其字段的私有