无法在 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++11(列表初始化+变量类型推导+右值引用和移动语义+新的类功能+可变模板参数)
C++进阶第二十五篇——C++11(列表初始化+变量类型推导+右值引用和移动语义+新的类功能+可变模板参数)