- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
什么时候 lambda a 可以保证是微不足道的,如果有的话?
我假设如果它只捕获普通类型或什么都不捕获,那将是微不足道的。不过,我没有任何标准语言来支持这一点。
我的动机是将一些代码从 Visual C++ 12 移到 14 并发现一些静态断言在处理我认为微不足道的 lambda 时失败。
例子:
#include <type_traits>
#include <iostream>
using namespace std;
int main()
{
auto lambda = [](){};
cout << boolalpha << is_trivially_copyable<decltype(lambda)>{} << endl;
}
这会在 vs140 上产生 false
而在 vs120 和 clang 中产生 true
。由于周围没有 gcc >= 5,我无法测试 gcc。我希望这是 vs140 的回归,但我不确定这里的行为是否正确。
最佳答案
标准没有指定闭包类型(lambda 表达式的类型)是否是平凡的。它明确地将其留给实现,这使其不可移植。恐怕你不能依赖你的 static_assert
产生任何一致的东西。
引用 C++14 (N4140) 5.1.2/3:
... An implementation may define the closure type differently from what is described below provided this does not alter the observable behavior of the program other than by changing:
- the size and/or alignment of the closure type,
- whether the closure type is trivially copyable (Clause 9),
- whether the closure type is a standard-layout class (Clause 9), or
- whether the closure type is a POD class (Clause 9).
...
(强调我的)
解析那句话中的双重否定后,我们可以看到允许实现来决定闭包类型是普通可复制、标准布局还是POD。
请注意,相同的措辞也出现在 C++17 (N4659) [expr.prim.lambda.closure] 8.1.5.1/2 中。
关于c++ - 什么时候 lambda 微不足道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32986193/
什么时候 lambda a 可以保证是微不足道的,如果有的话? 我假设如果它只捕获普通类型或什么都不捕获,那将是微不足道的。不过,我没有任何标准语言来支持这一点。 我的动机是将一些代码从 Visual
看似微不足道,但找不到解决方案 - 我需要编写查询,根据属性值获取人员(例如,让我找到具有属性“1”和“2”和“3”的人) *澄清:可以对三个以上的属性值进行查询- 它将由用户选择 - 从 0 到 n
我是一名优秀的程序员,十分优秀!