Неожиданный nullptr в расширении конструктора шаблонов variadic - PullRequest
0 голосов
/ 04 июня 2018

Сложно объяснить, вот короткий автономный пример того, что я имею в виду:

#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)

Что вызывает такое поведение?Это ошибка компилятора?Или я что-то упустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...