Таким образом, при написании шаблона класса C ++ я определил метод, который возвращает объект шаблонного типа, как таковой:
template <typename T>
class Foo
{
public:
T GetFoo()
{
T value;
//Do some stuff that might or might not set the value of 'value'
return value;
}
};
int main() {
Foo<int> foo;
foo.GetFoo();
return 0;
}
Это дает следующее предупреждение:
prog.cpp: In member function ‘T Foo<T>::GetFoo() [with T = int]’:
prog.cpp:15: warning: ‘value’ is used uninitialized in this function
Я понимаю, почему это происходит - я возвращаю неинициализированный int
как часть GetFoo
.Дело в том, что если бы я использовал Foo<SomeClass>
, строка T value;
инициализировала бы value
с использованием конструктора по умолчанию SomeClass
.
Мне удалось подавить это предупреждение, выполнив следующие действия:
T GetFoo()
{
T value = T();
//Do some stuff that might or might not set the value of 'value'
return value;
}
Похоже, это работает для примитивных типов (таких как int
и float
) и классов, по крайней мере, если у этого класса есть конструктор по умолчанию и конструктор копирования.Мой вопрос - это общепринятый способ решения этой проблемы?Есть ли побочные эффекты, о которых я должен знать?