6

我将 lambda 传递给一个接受它作为 r 值引用的函数。

如果我的 lambda 是在函数调用本身中定义的,我真的不在乎它以后会发生什么。
但是,如果我的 lambda 是一个变量(比如我想多次使用它),我确实想知道它没有被移出。

有没有办法知道它是否会被移出,使其在呼叫返回后相应地无法使用或可用?

编辑:

澄清一下,lambda 没有捕获任何东西。我关心的是函子本身:auto fn = [](int a){ return a; };

让我更难。我将函子作为右值传递:std::move(fn)

std::move 只是一个演员表。它不会移动任何东西,但被调用者中的右值参数现在绑定到正确的右值。

问题是,fn保证会被感动吗?能保证不动吗?有任何保证吗?我可以让它以这种方式或那种方式运行,还是由被调用者决定?

我想知道,因为我想知道我可以fn作为函数参数传递两次。

编辑#2:

让我们再看一个案例。我必须用容器调用一个函数。矢量、地图或其他任何东西。函数签名说&&。我可以用 std move 或 std forward 包装我的容器,以将右值 ref 放入被调用者。这真的是一回事,因为他们都是美化的演员。

现在,假设我使用了标准转发,因为我真的很喜欢我的容器不会去任何地方。

我可以很容易地看到被调用者没有意识到我的意图,并在调用后移动我的容器使其无效(内脏)。这是语言缺陷还是我错过了什么?

4

1 回答 1

3

好吧,如果该函数接受通用引用并且您想禁止移动,则有许多选项可供您选择,其中包括:

  1. 通过常量引用传递(C++17 必须std::as_const()简化它)。
  2. 将其保存为本地,不要转换为右值引用。看来你是这样做的。
  3. 使用某些东西将右值引用显式转换为左值引用。

当然,除非 lambda 通过值捕获具有与复制语义不同的移动语义的局部变量,并且被调用的函数实际上利用了这一点,否则这一点是没有意义的。

它真的会抓住机会吗?
检查合约,然后简单地信任它或尝试验证实现。没有捷径可走。

更不用说 C++ 允许程序员明确选择退出它提供的(有限的)安全性。

于 2018-11-04T21:55:18.183 回答