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

Posted

技术标签:

【中文标题】无法在 C++ 中模板的初始化列表中使用 lambda【英文标题】:Unable to use lambda in initialization list of template in C++ 【发布时间】:2011-10-01 06:06:45 【问题描述】:

我有一个带有 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 的问题。

【问题讨论】:

类名不要写“Class”前缀,代码会更清晰 VC++2010 实现了一个更旧的更有限的 lambda 版本。它们与最新的 C++0x 草案有许多微妙的不兼容。因此,您可能会遇到问题,但我不能 100% 确定。 代码似乎正确,GCC 接受它。 @KennyTM:算了。我用()翻转了[],猜想我再也看不到右括号了。写得正确,它可以在 gcc 上运行,但在 VS2010 上仍然失败。 @aimozg 欢迎来到 Stack Overflow!如果您自己解决了问题,请在此处发布您的答案并接受,以免该问题继续显示为“未回答”。 【参考方案1】:

这是一个 MSVS C++0x 实现问题(参见问题中的 cmets)。问题解决了。

【讨论】:

猜猜这个链接:cpprocks.com/… 可能对那些在 VC2010 中查看 lambda 相关错误的人有用

以上是关于无法在 C++ 中模板的初始化列表中使用 lambda的主要内容,如果未能解决你的问题,请参考以下文章

构造函数中的 C++ 初始化列表

C++进阶第二十五篇——C++11(列表初始化+变量类型推导+右值引用和移动语义+新的类功能+可变模板参数)

C++进阶第二十五篇——C++11(列表初始化+变量类型推导+右值引用和移动语义+新的类功能+可变模板参数)

C++进阶第二十五篇——C++11(列表初始化+变量类型推导+右值引用和移动语义+新的类功能+可变模板参数)

在 C++ 中模板化列表

c++ 学习错误列表