c++ - 为什么捕获的 lambda 不能应用于 std::valarray?

标签 c++ lambda stl valarray

什么不符合捕获 lambda 传递给 std::valarrayapply 方法的条件? 考虑以下代码:

int main()
{
    std::valarray<int> arr = {1, 2, 3, 4, 5, 6};
    auto arr1 = arr.apply([](int val) { return val * 2; }); // compiles
    int n = 3;
    auto arr2 = arr.apply([n](int val) { return val * n; }); //does not compile
    return 0;
}

在 coliru 上生活 http://coliru.stacked-crooked.com/a/f0407046699574fc

测试于 https://gcc.godbolt.org/
GCC、MSVC 或 CLang 都不会编译以上代码

最佳答案

原因在std::valarray::apply的定义中:

valarray<T> apply( T func(T) ) const;
valarray<T> apply( T func(const T&) ) const;

两个成员中func 的类型都是函数类型。当用作另一个函数的参数类型时,它会衰减为函数指针。这些成员函数不接受一般仿函数。仅指向常规函数的指针。

现在,无捕获 lambda 有一个指向函数指针的隐式转换运算符。因此,第一个 lambda 被转换为一个 int(*)(int),它是可以执行 lambda 主体的常规函数​​的地址。

但捕获状态的 lambda 不能以这种方式转换,正如您所见,不能作为参数传递给 std::valarray::apply

关于c++ - 为什么捕获的 lambda 不能应用于 std::valarray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46023154/

相关文章:

c++ - CUDA进程间通信

c++ - Qimage转cvMat 64FC3格式

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 如何对 unique_ptr 列表进行排序?

c++ - C++ 中 lambda 派生的隐式仿函数的生命周期是多少?

c++ - 从数组(指针)中分配一个 vector

c++11 - 使用 emplace 添加到 std::map 时如何避免临时副本?

c++ - 使用 MatGeoLib 进行 3D 碰撞检测?

java - 函数式 Java-8 lambda 与显式表达式报告编译器错误

c++ - 为刚刚声明的类定义 STL 容器。