我在使用模板时遇到了一点问题:
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#
谢谢!
最佳答案
ret
可能未初始化,因为 T
可能是 POD 类型或其他没有用户声明的构造函数的类型。
您可以像这样调用默认构造函数(并值初始化任何 POD 类型对象):
T ret = T();
return ret;
或者,更简洁地说,
return T();
这假设 T
是默认可构造的。如果您可能需要使用不可默认构造的类型实例化此函数,您可以将“默认”情况作为参数。例如,
template <typename T>
T Func(const T& default_value = T())
{
// ...
}
这将允许您仍然为默认可构造的类型调用 Func()
,但也可以显式提供一个值以返回给不可构造的类型。
关于C++ 模板默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3445348/