代码之家  ›  专栏  ›  技术社区  ›  rafak

在模板代码中lambda应该衰减为函数指针吗?

  •  9
  • rafak  · 技术社区  · 14 年前

    我在某个地方读到,如果捕获列表为空,lambda函数应该衰减为函数指针。我现在能找到的唯一参考是 n3052 . 在g++(4.5&4.6)中,除非lambda在模板代码中声明,否则它可以按预期工作。

    例如,以下代码将编译:

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

    但是当模板化时它不再编译(如果 foo

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

    在上面的参考文献中,我看不到对这种行为的解释。这是g++的临时限制吗?如果不是,是否有(技术)原因不允许这样做?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Peter Alexander    14 年前

    我想不出有什么理由会特别禁止。我猜这只是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 未参数化)。