c++ - lambda 应该衰减到模板代码中的函数指针吗?

标签 c++ templates lambda c++11 function-pointers

我在某处读到,如果捕获列表为空,lambda 函数应该退化为函数指针。我现在能找到的唯一引用是 n3052 .对于 g++(4.5 和 4.6),它按预期工作,除非在模板代码中声明了 lambda。

例如下面的代码编译:

void foo() {
    void (*f)(void) = []{};
}

但是它在模板化时不再编译(如果 foo 实际上在别处被调用):

template<class T>
void foo() {
    void (*f)(void) = []{};
}

在上面的引用资料中,我没有看到对此行为的解释。这是 g++ 的临时限制吗?如果不是,是否有(技术)原因不允许这样做?

最佳答案

我想不出有什么理由会特别禁止它。我猜这只是 g++ 的临时限制。

我还尝试了一些其他的东西:

template <class T>
void foo(void (*f)(void)) {}

foo<int>([]{});

有效。

typedef void (*fun)(void);

template <class T>
fun foo() { return []{}; } // error: Cannot convert.

foo<int>()();

那不是(但是如果 foo 没有参数化的话)。

注意:我只在 g++ 4.5 中测试过。

关于c++ - lambda 应该衰减到模板代码中的函数指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3155869/

相关文章:

C++ STL 映射,std::pair 作为键

c++ - 为 typedef 的函数指针推导模板参数

angularjs - 从不同的 JEE 应用程序获取 AEM 创作的模板

c# - 如何将 lambda 表达式作为返回方法的参数?

c++ - Qt 信号 lambda 导致 shared_ptr 泄漏?

c++ - Kinect与Opencv,深度图,如何使用

python - 如果该对象的类在另一个 boost 模块中声明,如何使用 boost 将指向 C++ 对象的指针返回给 python?

c++ - 为什么要使用复制构造函数 C++

c++ - 可变参数模板,size_t

python - 此代码如何计算 4 的 <exponent> 次方