c++ - 无法在 C++ 模板的初始化列表中使用 lambda

标签 c++ templates lambda constructor c++11

我有一个带有 std::function 构造函数参数的类。

class ClazzA{
public:
    ClazzA(function<void()> foo){}
    ClazzA(){
        ClazzA([](){});
    }
};

如果我有一个此类的实例作为另一个类的成员,我必须在初始化列表中调用构造函数。我可以传递一个 lambda 作为参数,它会自动转换:

class ClazzB{
public:
    ClazzA a;
    ClazzB() :
      // works fine:
      a([](){}){}
};

但是如果 ClazzB 是一个模板,lambda 不起作用:

template<typename T> class ClazzC{
public:
    ClazzA a;
    //works fine:
    ClazzC(function<void()> foo) : a(foo){}
    //doesn't work:
    ClazzC() :
      //syntax error : ')'
      a([](){})
      //syntax error : '{'
      //unexpected token(s) preceding '{'; skipping apparent function body
      {}
};

编译器是 MSVC++ 2010。我不明白我做错了什么或者为什么不支持这种语法。

一开始ClazzA也是模板,函数有点复杂,以为是模板lambda什么的问题。但在我删除所有代码后,问题仍然存在。

UPD:尝试在 MinGW G++ 中编译,它有效。看起来像是 Visual Studio 问题。

最佳答案

这是一个 MSVS C++0x 实现问题(请参阅问题下的评论)。问题解决了。

关于c++ - 无法在 C++ 模板的初始化列表中使用 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6624470/

相关文章:

c++ - 为类模板重载非成员算法

C#:在类实例化上创建一个什么都不做的 Action

c# - 在 Lambda 表达式中引用私有(private)属性(property)?

c++ - 绘制和旋转箭头

c++ - 将 RGB 444 转换为可显示的图像

c++ - RtlpNtMakeTemporaryKey - VerySleepy 表示这需要很多时间

c++ - 如何参数化用作另一个 lambda 参数的 lambda

c++ - 通过地址调用函数

c++ - static_if 会弃用模板特化吗?

CUDA 中的 C++11 别名模板