Bit*_*ler 5 c++ lambda move-semantics c++11 forwarding-reference
我将lambda传递给一个函数,该函数接受它作为r值引用.
如果我的lambda是在函数调用本身中定义的,那我以后真的不关心它会发生什么.
但是如果我的lambda是一个变量(假设我想多次使用它),我确实想知道它不是移动的.
是否有办法知道它是否会被移动 - 在呼叫返回后使其无法使用或相应可用?
编辑:
只是为了澄清,lambda没有捕获任何东西.我关心的是仿函数本身:auto fn = [](int a){ return a; };
让我更难.我将传递函数作为右值:std::move(fn)
std :: move只是一个演员.它不移动任何东西,但被调用者中的rvalue参数现在绑定到正确的右值.
问题是,fn保证会被感动吗?是否保证不被感动?有什么保证吗?我可以让它以这种方式或那种方式运行,还是由被调用者来做?
我想知道,因为我想知道我可以fn作为函数参数传递两次.
编辑#2:
我们来看另一个案例吧.我必须用容器调用一个函数.矢量,地图或其他任何东西.功能签名说&&.我可以使用std move或std向前包装我的容器以获得rvalue ref到被调用者.这真是一回事,因为他们都是美化的演员.
现在,让我们说我使用std前进因为我真的很喜欢我的容器不能去任何地方.
我很容易看到被叫方没有意识到我的意图,并且在通话结束后移动我的容器使其无效(内脏).这是语言缺陷还是我错过了什么?
好吧,如果该函数接受通用引用并且您想禁止移动,那么有很多选项可供您选择,其中包括:
std::as_const()简化这一点)。当然,除非 lambda 通过具有与复制语义不同的移动语义的值捕获局部变量,并且被调用的函数实际上利用了这一点,否则这一点是没有意义的。
它真的会抓住这个机会吗?
检查合同,然后简单地信任它或尝试验证其实施情况。没有捷径。
更不用说 C++ 允许程序员显式选择退出它提供的(有限的)安全性。
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |