c++ - std::bind() 参数列表中仿函数的执行顺序(可能与函数参数的评估顺序无关)
问题描述
我只是想知道并编写以下代码:(我不是在寻求解决方法,我只是想知道是否可以bind()
完美地处理这个问题)。此外,我认为bind
可以处理这个并为它定义一个顺序,但我不确定或者它可能只是一个参数评估顺序问题。
#include <functional>
#include <utility>
#include <iostream>
using namespace std;
class increment{
public :
string operator()(int& x)
{
++x;
return string {"dumb_return_value"};
}
};
class multiply{
public :
string operator()(int& x)
{
x = x * 2;
return string {"dumb_return_value"};
}
};
template <typename A, typename B>
class do_nothing{
public :
void operator()(A , B)
{
return;
}
};
int main()
{
int x = 0;
increment increment_object;
multiply multiply_object;
do_nothing<string,string> do_nothing_object;
bind(do_nothing_object,bind(increment_object,ref(x)),bind(multiply_object,ref(x)))();
cout << x << endl;//output 2
x = 0;
bind(do_nothing_object,bind(multiply_object,ref(x)),bind(increment_object,ref(x)))();
cout << x << endl;//output 1
}
编译选项:std=c++1z
所以,我在这里使用引用语义来放大差异。这些子函数的执行顺序是increment
什么multiply
?是否有意bind
地处理这个并定义一个顺序,或者它取决于函数参数评估序列,这是编译器特定的?如果std::bind()
处理得当,请注明,谢谢!
PS:我问这个问题的一个原因是:c++ 等效于 java 的 andThen 函数来复合新函数?
解决方案
以此草稿为参考。
func.bind.bind [20.10.9.1.3] 没有指定何时评估绑定子表达式或其顺序。
它只是说明,如果要绑定的参数之一是绑定表达式结果,则外部绑定表达式的返回值使用调用内部绑定表达式的结果以及传递给外部绑定表达式的参数。它没有给出何时评估这些值的顺序信息;有人可能会假设它“必须”在外部绑定表达式传递参数之后发生,但是(据我所知)只有我可以用常识得出结论,而不是从标准文本本身得出结论。
推荐阅读
- android - 当清单中有`android:supportsRtl =“false”`时,如何在运行时更改ConstraintLayout的布局方向?
- groovy - 从目录中合并N个文件并存储在groovy中的一个文件中
- acrobat - \pdfmark(Acrobat Distiller)的官方文档中的错误
- vue.js - 如果我真的不需要 3d 动画,我可以使用 translate(2d) 而不是默认的 translate3d 来刷卡吗?
- encryption - 我对“Hashcat”错误“Bitlocker”哈希有疑问
- python-3.x - 将多行与前一行进行比较,如果满足条件,则减去 pandas
- php - 无法在 codeigniter STEP、STP、IGES、IGS、SLDPRT、3DM、SAT 或 X_T 中上传这些格式文件
- json - 需要 json 值而不重新加入 SQL Server 中的表
- python - 如何替换 Bokeh DataTable 中的索引列?
- gnu-make - 从源代码构建 glibc 会导致错误