我有以下代码,可以用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
}
是否有确切的建议可以编译此代码,或者是通过其他功能实现的?
答案 0 :(得分:8)
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也是如此。