繁体   English   中英

C ++ 17 lambda捕获具有宽松的类型要求

[英]C++17 lambda captures with relaxed type requirements

我有一个以下代码,用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也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM