模板有点问题:
template <typename T>
T Func(){
std::string somestr = "";
// somestr = ...
if (somestr != ""){
return boost::lexical_cast<T>(somestr);
}
else{
T ret; // warning: "ret may be uninitialized in this function"
return ret;
}
}
如果此函数无法获得结果,我想返回一个有效的对象,但尽可能为空。如果我像上面那样做,我会收到警告“ret可能在此功能中未初始化”。 Try-Catch无法删除警告..
有没有办法像C#中的default
关键字一样?
return default(T); // C#
谢谢!
答案 0 :(得分:23)
ret
可能未初始化,因为T
可能是POD类型或其他没有用户声明的构造函数的类型。
您可以调用默认构造函数(并对任何POD类型对象进行值初始化),如下所示:
T ret = T();
return ret;
或者,更简洁,
return T();
这假设T
是默认构造的。如果您可能需要使用不是默认构造的类型来实例化此函数,则可以将“默认”大小写作为参数。例如,
template <typename T>
T Func(const T& default_value = T())
{
// ...
}
这样您仍然可以为默认可构造的类型调用Func()
,但也可以为非类型的类型显式提供值。