Сложно объяснить, вот короткий автономный пример того, что я имею в виду:
#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)
Что вызывает такое поведение?Это ошибка компилятора?Или я что-то упустил?