我正在继承的类的构造函数需要传入一个重要的对象。与此类似:
MyFoo::MyFoo() : SomeBase( complexstuff )
{
return;
}
complexstuff
与 MyFoo
没什么关系,所以我不想把它传入。
我没有编写某种返回 complexstuff
的 1-off 临时函数,而是使用了 lambda。我花了几分钟才弄清楚我必须 调用 lambda。所以我的代码现在看起来像这样:
MyFoo::MyFoo() : SomeBase(
[]()
{
/* blah blah do stuff with complexstuff */
return complexstuff;
} () )
{
return;
}
如果你没有抓住它,它是微妙的。但是在 lambda 主体之后,我不得不放 ()
告诉编译器立即“运行” lambda。在我弄清楚我做错了什么之后,这是有道理的。否则,如果没有 ()
来调用 lambda,gcc 会这样说:
error: no matching function for call to 'SomeBase(<lambda()>)'
但现在这让我想到——我做对了吗?在 C++11 或 C++14 中是否有更好的方法来告诉编译器我希望它立即调用我编写的 lambda?或者是附加一个空的 ()
就像我用通常的方法做的那样?
原文由 Stéphane 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,你做到了。
从来没听说过。 lambda 也只是一个函数对象,所以你 需要 一个
()
来调用它,没有办法绕过它(当然除了一些调用 lambda 的函数,比如std::invoke
)。如果您愿意,可以在捕获列表之后删除
()
,因为您的 lambda 不采用任何参数。是的,这是最短的方法。如前所述,
std::invoke
也可以代替,但它需要更多的输入。我想说直接调用()
是通常的方式。