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