C ++ 17 lambda捕获具有宽松的类型要求
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++ 17 lambda捕获具有宽松的类型要求相关的知识,希望对你有一定的参考价值。
我有一个以下代码,用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
}
是否有任何关于此代码编译的确切建议,或者它是否通过其他一些功能?
答案
Guaranteed Copy Elision(与wording)。这里的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也是如此。
以上是关于C ++ 17 lambda捕获具有宽松的类型要求的主要内容,如果未能解决你的问题,请参考以下文章