Можно ли инициализировать переменную-член в теле конструктора вместо списка инициализаторов?

Как вы, возможно, знаете,

A::A() {
this->foo = 1;
}

Такой же как:

A::A() : foo(1) {
this->foo = 1;
}

Что неэффективно из-за двойной декларации.
Компилятор может оптимизировать это, но в моем случае класс не является POD.
Я должен определить член в теле конструктора, так как он не может быть сжат в одну строку.

Есть ли способ сделать это?

1

Решение

Нет, вы не можете инициализировать в теле конструктора. Это должно быть сделано в списке mem-initializer или с использованием инициализаторов в классе (при объявлении члена). Однако ничто не мешает вам вызвать функцию (или лямбду) для инициализации:

A::A() : foo([]() { /* ... */ } ())
{}

// or

A::A() : foo(initFoo())
{}

Foo A::initFoo() { /* ... */ }
3

Другие решения

Других решений пока нет …