在if语句中禁用枚举赋值g ++

时间:2015-11-26 09:24:03

标签: c++ g++

我想将if语句中的赋值视为错误:

#include <cstdio>

enum some {
    a,
    b
};

void foo(some e) {
    if (e = a) {
        puts("yes");
    } else {
        puts("no");
    }
}

int main() {
    foo(a);
    return 0;
}

这似乎是一件理智的事情,除了我也想要这样的东西:

boost::optional<int> optionalValue;
if (const auto& value = optionalValue) {

}

-Wall给了我enum.cpp:9: warning: suggest parentheses around assignment used as truth value,但我想提供比-Wall更具体的内容

2 个答案:

答案 0 :(得分:1)

您可以将e声明为const。然后分配将是一个错误。

或者,您可以告诉g ++将警告视为-Werror的错误。然后,结合适当的警告设置,if表达式中的任何赋值都将是错误。您只能使用-Wparentheses启用此类警告但请注意,有时这不是错误,而是故意进行的。这就是为什么g ++建议使用括号来消除意外分配的歧义。

答案 1 :(得分:1)

如果您使用更新版本的g ++,它会告诉您哪个警告标志对应哪个诊断。使用g ++ 4.9.2,您的代码会给出:

m.cc:9:14: warning: suggest parentheses around assignment used as truth value [-Wparentheses]

这告诉您错误来自标记-Wparentheses,该标记是-Wall的子集。

您可以指示g ++使用-Werror将所有警告视为错误。但是,如果您只想将此特定警告视为错误,则可以使用:

-Werror=parentheses

此版本的g ++不会针对您建议的代码const auto& value = optionalValue发出警告,因此可能是时候升级您的编译器版本了。