В следующем примере используется copy-initialization , что, вероятно, нормально в 95% случаев в C ++ 03:
T var = T();
Но для generic C ++ 03 код, вы всегда должны предпочитать прямую инициализацию для учета этих других 5%:
T var((T())); // extra parentheses avoid the most vexing parse – the extra parentheses
// force the contents to be evaluated as an expression, thus implicitly
// *not* as a declaration.
Или еще лучше, используйте Boost . Utility.ValueInit библиотека, которая упаковывает идеальное поведение для вас вместе с обходными путями для различных недостатков компилятора (к сожалению, больше, чем можно подумать):
boost::value_initialized<T> var;
ДляC ++ 11, можно использовать синтаксис инициализации списка для достижения прямой инициализации значения значительно менее шумно / безобразно:
T var{}; // unambiguously value-initialization*
(* Nb это только инициализация значения для типов, которые неиметь унарный конструктор, принимающий std::initializer_list<>
; для типов, которые его делают, этот конструктор будет вызываться вместо этого - действительно, "равномерная инициализация" ... Конечно, чистый результат должен быть одинаковым для вменяемых типов.)