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

disable enum assignment g++ in if statement

本文关键字:枚举 赋值 g++ if 语句 禁用      更新时间:2023-10-16

我想将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 更具体的东西

您可以将e声明为const。那么赋值就是一个错误。

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

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

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

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

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

-Werror=parentheses

这个版本的g++不会对您建议的代码const auto& value = optionalValue发出警告,所以也许是时候升级您的编译器版本了。