Есть условный код который конструирует объект в одном случае строкой, в другом - числом (суть в том, что разными типами и соответственно вызывает разные конструкторы):
Foo foo;
if (someFlag)
foo = Foo("SomeString");
else
foo = Foo(42);
Если я не ошибаюсь, то данный код вызовет как минимум один лишний конструктор по умолчанию и один оператор присваивания. Если объявление foo внести в сам if-else блок, то проблема с областью видимости.
Вопрос как сделать такой условный вызов конструктор правильно и без оверхеда?
На ум приходит только вариант с указателем и foo = new Foo внутри if-else, но это надо потом не забыть delete(unique_ptr слишком многословен и хотелось бы вообще избежать указателей).
UPD: варианты обойти проблему найти можно. Вопрос в первую очередь в том можно ли объявить переменную пользовательского класса, но отложить её инициализацию.
UPD2: а может есть вариант расширить область видимости за пределы блока if-else в случае если там объявлять переменную?
UPD3: Всем спасибо за решения, было интересно почитать.
Самыми адекватными вариантами на данный момент выглядят copy-elision c функцией возвращающей объект в зависимости от флага и указатель. Хотя на мой взгляд оба требуют лишних телодвижений со стороны программиста.