【发布时间】:2015-02-26 00:56:42
【问题描述】:
我正在阅读 Scott Meyer 的 Effective Modern C++ 并点击了他建议使用 lambdas 代替 std::function 和 std::bind 的项目。我理解他的论点和他关于std::function 缺点的说法,我同意他的看法。
从今天开始,我决定改用模板来存储lambdas(不需要修改器)。我确实明白每个lambda 的类型只有编译器知道,甚至两个相同的lambdas 也会有不同的类型,那么下面的代码怎么编译和工作得很好?
template<typename LambdaT>
class CaptureLambda
{
public:
CaptureLambda(const LambdaT& fn)
: mActionFn(fn) // initialize mActionFn to a user supplied lambda
{}
private:
LambdaT mActionFn{ []{} }; // initialize mActionFn to an empty lambda
};
我的困惑是,为什么 mActionFn 默认初始化为在成员声明中具有不同类型的空 lambda,但该类的构造函数很高兴在其参数中接受另一种类型的 lambda?他们cast可以互相联系吗?如果是,为什么以下内容让编译器感到难过?
// Class stuff...
template<typename T>
void resetActionFn(const T& newFn) { // setter member
mActionFn = newFn;
}
// Class stuff...
【问题讨论】:
标签: c++ c++11 visual-studio-2013 lambda