clang ++ 抱怨变量未初始化:
template<typename TEnum> void func() {
TEnum enumVar;
// ...
if(something()) enumVar = someValue();
// ...
if(something()) doSomethingWith(enumVar); // <- clang++ tells me
// enumVar may be uninitialized
}
通常,要避免此警告,枚举可能会有Unknown = -1
值或类似的值 - 但不幸的是,枚举类型由用户传递为typename TEnum
,所以我不知道是否它包含一个“空值”。
有什么方法可以解决这个问题吗?或者我应该忽略/禁止警告?
答案 0 :(得分:3)
只需始终初始化,例如使用三元运算符,然后继续处理它:
template<typename TEnum>
void func()
{
TEnum enumVar = something() ? someValue() : otherValue();
if (something())
doSomethingWith(enumVar);
}
显然,如果something()
价格昂贵,你可以缓存它等等,但重点仍然是:从处理中单独初始化。
答案 1 :(得分:2)
您可以初始化枚举:
template<typename TEnum> void func() {
TEnum enumVar = TEnum();
// TEnum enumVar {}; // C++11 way
// ...
if(something()) enumVar = someValue();
// ...
if(something()) doSomethingWith(enumVar);
}
请注意,枚举的值为0
,可能是无效值。
答案 2 :(得分:0)
boost::optional<E>
采用几乎常规的类型,并通过将未初始化定义为空来对其进行正规化。如果为空则使用UB,除了检查它是否为空或similsr操作。
答案 3 :(得分:0)
您可以在功能模板中再添加一个模板参数:
template<typename TEnum, TEnum nullValue> void func() {
TEnum enumVar = nullValue;
// ...
}
在C ++ 11中,您还可以使用默认模板参数:
template<typename TEnum, TEnum nullValue = Enum()> void func() {
TEnum enumVar = nullValue;
// ...
}