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

muX*_*t2X 34 c++ c++11

所以昨天我在这里读了这个问题并且发现了最好的投票答案,我用这样的代码来递归地调用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)

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

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

该类型的两个变量的fdummystd::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可以在相同的声明中调用,如链接问题所希望的那样.解决方案很愚蠢,但也许是欲望.