Я не уверен на 100%, что вы подразумеваете под «напрямую».
Но в этом случае вы должны использовать список инициализатора для инициализации переменных-членов. Подробнее о списках инициализаторов здесь .
Применительно к вашему коду конструктор теперь будет выглядеть следующим образом:
lazy_segment_tree(vector<T> &seq, T (*merge)(T,T), T (*create)(int, T,T), T defvalue)
: join(merge)
, assign(create)
, base(defvalue)
, n(seq.size())
{}
В исходном коде все члены являются первыми создается по умолчанию во время инициализации класса. Затем вызывается тело конструктора, где вы используете '=', чтобы скопировать, назначить параметры конструктора.
Когда используется список инициализатора, члены создаются напрямую с указанными параметрами.
В зависимости на то, что T может быть, это может или не может иметь реальное значение. Тем не менее списки инициализаторов являются стандартным способом инициализации членов класса, и вы должны использовать его, если это возможно.