Вот прием, который вы можете использовать, используя локальный класс:
template <typename T> void foo() {
struct THolder {
T obj;
THolder() : obj() { } // value-initialize obj
};
THolder t1; // t1.obj is value-initialized
}
Я думаю, что прочитал об этом приеме из ответа на другой вопрос переполнения стека, но я не могу найти этот вопрос намомент.
Кроме того, вы можете использовать шаблон класса boost::value_initialized<T>
, который в основном делает то же самое, с большей гибкостью и согласованностью, а также с обходными путями для глючных компиляторов.
В C ++ 0x, это намного проще: вы можете использовать пустой список инициализаторов:
T obj{}; // obj is value-initialized
(Насколько мне известно, только gcc 4.5+ поддерживает списки инициализаторов C ++ 0x. Clang и Visual C ++ пока нетподдержать их.)