C 17 Lambda捕获具有轻松型要求的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的同样保留。
相关文章:
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 可变参数泛型 lambda 和函数重载
- 泛型lambda和一元+运算符
- 具有静态大小数组作为参数的泛型 lambda
- 是否可以使用默认泛型参数在C++中定义 lambda?
- 获取模板函数/泛型 lambda 的唯一返回类型
- C++17 如何编写is_pointer_pointer泛型 lambda
- 继承类中没有匹配的泛型委托作为 lambda 参数
- C 17 Lambda捕获具有轻松型要求的Lambda
- C++14:具有泛型std::函数作为类成员的泛型lambda
- 当C++14已经具有泛型lambda时,在C++20中引入的模板lambda需要什么
- 是否可以避免使用lambda中的尾随返回型语法
- 是否可以通过从lambda的引用中返回T型对象,而无需使用尾随返回类型语法
- 在泛型lambda表达式的所有实例化之间共享的局部静态变量
- 将 lambda 函数传递给泛型函数C++
- 为什么C++14泛型lambda在参数规范中需要auto
- 编译器推导出了泛型lambda的类型
- 在泛型lambda中使用模板参数
- 如何创建可变参数泛型 lambda
- 泛型lambda在C++14中是如何工作的