dummy()函数 - 应该是什么?

时间:2017-03-15 09:12:36

标签: c++ c++11

所以昨天我在这里读了this问题并且发现了最好的投票答案,使用这样的代码来递归地调用lambda

std::function<void(int)>
    f {[&f](int i){
        // do something
    }},
    dummy((f(3), nullptr));

我想知道dummy(...)部分是关于什么的,所以我做了一些研究但是找不到任何关于它的东西。在答案中提供的代码片段中,使用了<utility>标头,所以我想必须在那里的某处声明这个东西,但我仍然无法找到它的任何内容。

有人可以解释dummy函数(或函子)的作用,声明的位置以及通常用于它的内容吗?

我的意思是在示例中显然用于调用函数f。但它的实际目的是什么?

注意:我知道这个问题有点宽泛,但由于我无法找到有关它的任何信息,我无法将问题集中在一个特定的问题上。此外,我希望我的问题的答案将帮助其他人找到有关神秘dummy()的信息。

2 个答案:

答案 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)};

这样,它应该更清楚。这是一个声明两个变量的声明:fdummyf初始化为42dummy初始化为此表达式:(f += 1, 0)。那个人使用逗号运算符首先评估f += 1,丢弃结果,然后使用值0来初始化dummy

回到完整(非简化)声明:

变量fdummy的类型均为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可以在相同的声明中被调用,如链接问题所希望的那样。解决方案很愚蠢,但也许是愿望。