2014-01-09 69 views
4

铛++抱怨未初始化变量:通用模板化枚举空值

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

布尔is_something =东西(),如果(is_something)可能会有所帮助。它可能会破坏逻辑(第二件事可能会返回一个不同的值),因此警告。 –

+0

如何做'TEnum enumVar = TEnum();'? – billz

回答

2

您可以初始化枚举:

template<typename TEnum> void func() { 
    TEnum enumVar = TEnum(); 
    // TEnum enumVar {}; // C++11 way 

    // ... 
    if(something()) enumVar = someValue(); 
    // ... 
    if(something()) doSomethingWith(enumVar); 
} 

注意,枚举将具有价值0这可能是一个无效值。

+0

'TEnum enumVar {}'很好,谢谢。 –

+0

Minor nitpick:这将初始化和分配,所以这是效率低下和不好的风格。 – TemplateRex

3

只要始终初始化,例如与三元运算符,然后进行处理它:

template<typename TEnum> 
void func() 
{ 
    TEnum enumVar = something() ? someValue() : otherValue(); 
    if (something()) 
     doSomethingWith(enumVar); 
} 

显然,如果something()是昂贵的,你可以对其进行缓存等,但点保持:从处理单独初始化。

0

boost::optional<E>需要一个几乎正常的类型,并通过定义未初始化为空来规则化它。如果是空的,则使用UB,除了检查是否为空或similsr操作。

0

你可以多一个模板参数添加到您的函数模板:

template<typename TEnum, TEnum nullValue> void func() { 
    TEnum enumVar = nullValue; 
    // ... 
} 

在C++ 11你也可以使用默认的模板参数:

template<typename TEnum, TEnum nullValue = Enum()> void func() { 
    TEnum enumVar = nullValue; 
    // ... 
}