Как вы, возможно, знаете,
A::A() {
this->foo = 1;
}
Такой же как:
A::A() : foo(1) {
this->foo = 1;
}
Что неэффективно из-за двойной декларации.
Компилятор может оптимизировать это, но в моем случае класс не является POD.
Я должен определить член в теле конструктора, так как он не может быть сжат в одну строку.
Есть ли способ сделать это?
Нет, вы не можете инициализировать в теле конструктора. Это должно быть сделано в списке mem-initializer или с использованием инициализаторов в классе (при объявлении члена). Однако ничто не мешает вам вызвать функцию (или лямбду) для инициализации:
A::A() : foo([]() { /* ... */ } ())
{}
// or
A::A() : foo(initFoo())
{}
Foo A::initFoo() { /* ... */ }
Других решений пока нет …