所以昨天我在这里读了这个问题并且发现了最好的投票答案,我用这样的代码来递归地调用lambda
std::function<void(int)>
f {[&f](int i){
// do something
}},
dummy((f(3), nullptr));
Run Code Online (Sandbox Code Playgroud)
我想知道这个dummy(...)部分是什么,所以我做了一些研究但却找不到任何关于它的东西.在答案中提供的代码片段中<utility>使用了标题,所以我想那个东西必须在那里声明,但我仍然找不到任何关于它的东西.
有人可以解释一下这个dummy函数(或仿函数)做了什么,声明它的位置以及它通常用于什么?
我的意思是显然在示例中它用于调用函数f.但它的实际目的是什么?
注意:我知道这个问题有点宽泛,但由于我找不到任何有关它的信息,我无法将问题集中在一个特定的问题上.此外,我希望我的问题的答案将帮助其他人找到有关神秘的信息dummy().
Rei*_*ica 54
让我们通过使用更简单的类型和表达式来简化声明.我们将使用int来代替std::function<void(int)>,42而不是拉姆达,并f += 1代替f(3):
int f{42}, dummy((f += 1, 0));
Run Code Online (Sandbox Code Playgroud)
为了使它更加明显,我们还可以使用大括号而不是括号来进行第二次初始化:
int f{42}, dummy{(f += 1, 0)};
Run Code Online (Sandbox Code Playgroud)
这样,它应该更清楚.这是一个声明两个变量的声明:f和dummy.f初始化为42,并dummy使用以下表达式初始化:(f += 1, 0).那个人使用逗号运算符首先评估f += 1,丢弃结果,然后使用该值0进行初始化dummy.
回到完整(非简化)声明:
该类型的两个变量的f和dummy是std::function<void(int)>.首先f用lambda初始化.然后,dummy使用逗号表达式初始化.该表达式的左侧f(3)被评估并被遗忘.然后右侧nullptr用于初始化dummy.初始化a std::functionwith会nullptr导致创建一个空std::function对象(与默认构造的对象相同).
整个目的dummy是在f可以调用的同一行(=在同一声明中)引入一些额外的上下文.
eer*_*ika 18
其中[
dummy]被声明
在您显示的声明中.简化:
T f /* the declarator */, dummy /* the declarator */;
Run Code Online (Sandbox Code Playgroud)
dummy只是一个变量的名称,就像f.它们都在同一声明中声明.
有人可以解释那个虚函数(或函子)的作用
我的意思是显然在示例中它用于调用函数f.但它的实际目的是什么?
这是实际目的.它被声明的唯一原因是,f可以在相同的声明中调用,如链接问题所希望的那样.解决方案很愚蠢,但也许是欲望.