C 17 Lambda捕获具有轻松型要求的Lambda

C++17 lambda captures with relaxed type requirements

本文关键字:Lambda 松型      更新时间:2023-10-16

我有一个以下代码,它确实使用C 17编译器编译,但不会使用C 14。我想知道发生了什么变化,允许以下代码编译:

struct Foo{
  Foo()=default;
  Foo(const Foo&)=default;// copy by const ref 
};
struct Bar{
  Bar()=default;  
  Bar(Bar&)=default; //copy by non const
};
int main()
{
  Foo foo;
  Bar bar;
  Bar barcpy = bar;
  auto foolam = [foo]{};
  auto barlam = [bar]{}; //compiles only with C++17
}

该代码是否有任何确切的建议进行编译,或者是通过某些其他功能的方式?

保证复制elision(带有措辞)。这里的lambda实际上是红鲱鱼。

在C 14中,此:

auto barlam = [bar]{};

仍然需要移动构造是有效的(即使您不希望移动并且可能会省略移动)。但是,该lambda并非移动构造,因为Bar不可移动。Foo 移动构造,因此foolam工作正常。

它的非lambda版本是:

auto bar = Bar{}; // error in C++14
auto foo = Foo{}; // ok

在C 17中,这不是移动构造 - 我们只是直接初始化目标对象。从某种意义上说,我们正在充实行动。从某种意义上说,实际上根本没有语言规则的动作。因此:

auto bar = Bar{};

完全等同于:

Bar bar{};

lambda的同样保留。