为什么捕获lambda不能应用于std :: valarray?

时间:2017-09-03 11:49:07

标签: c++ lambda stl valarray

将lambda传递给apply std::valarray方法的不合格是什么? 请考虑以下代码:

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都不会编译上面的代码

1 个答案:

答案 0 :(得分:4)

原因在于std::valarray::apply

的定义
valarray<T> apply( T func(T) ) const;
valarray<T> apply( T func(const T&) ) const;

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

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

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