很难解释,这里是我的意思的一个简短的例子:
#include <functional>
#include <iostream>
typedef std::function<void(void)> f_t;
struct A { A(f_t f) { f(); } };
struct B { B(f_t f) { f(); } };
struct C { C(f_t f) { f(); } };
template<typename ... TT>
struct T : TT...
{
T( ) : TT([this](void) { std::cout << this << std::endl; })...
{
}
};
int main(void)
{
T<A, B, C> t;
return 0;
}
输出:
0x7ffe84574e6f
0
0
我的班级模板T
继承自其模板参数包TT
。每种类型的TT
都需要一个仿函数作为构造函数参数。当我尝试在构造函数调用期间传递捕获this
的仿函数时,除扩展的第一个构造函数调用之外的所有函数实际上都会收到一个将nullptr
捕获为this
的仿函数。如果我将仿函数创建委托给成员函数,它按预期工作:
template<typename ... TT>
struct T : TT...
{
T( ) : TT(genF())...
{
}
f_t genF( ) { return [this](void) { std::cout << this << std::endl; }; }
};
输出:
0x7ffefca4e61f
0x7ffefca4e61f
0x7ffefca4e61f
(使用的编译器是GCC 4.6.3)
导致这种行为的原因是什么?这是编译器错误吗?或者我错过了什么?