Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法初始化类型为';设计标志';具有类型为';int';_C++_Enums_Bitwise Operators_Flags - Fatal编程技术网

C++ 无法初始化类型为';设计标志';具有类型为';int';

C++ 无法初始化类型为';设计标志';具有类型为';int';,c++,enums,bitwise-operators,flags,C++,Enums,Bitwise Operators,Flags,我正在尝试创建一个枚举标志,以查看某个内容是否为粗体和斜体,但我遇到了编译错误: 错误:无法使用“int”类型的右值初始化“designFlags”类型的变量 designFlags myDesign=粗体|下划线 #include <iostream> using namespace std; enum designFlags { BOLD = 1, ITALICS = 2, UNDERLINE = 4 }; int main() { desi

我正在尝试创建一个枚举标志,以查看某个内容是否为粗体和斜体,但我遇到了编译错误: 错误:无法使用“int”类型的右值初始化“designFlags”类型的变量 designFlags myDesign=粗体|下划线

#include <iostream>
using namespace std;

enum designFlags {
    BOLD = 1,
    ITALICS = 2,
    UNDERLINE = 4
};

int main() 
{
    designFlags myDesign = BOLD | UNDERLINE; 

        //    00000001
        //  | 00000100
        //  ___________
        //    00000101

    cout << myDesign;

    return 0;
}
#包括
使用名称空间std;
枚举设计标志{
粗体=1,
斜体=2,
下划线=4
};
int main()
{
designFlags myDesign=粗体|下划线;
//    00000001
//  | 00000100
//  ___________
//    00000101

CUT< P> C++标准阻止您执行从<代码> int <代码>到<代码> EnUM <代码>的隐式转换(注:允许从代码< EnUM < /C> >到<代码> int >代码>的隐式转换。 但是,您可以改为执行静态强制转换:

designFlags myDesign = static_cast<designFlags>(BOLD | UNDERLINE);
cout << myDesign; // prints 5
更新:为什么
myDesign&BOLD
大多数时候都可以?

使用标志时,值必须是2的幂:1、2、4、8等。因此,每个可能的值只设置了一个位,并且每个位都不同

然后,当您执行
myDesign&BOLD
时,您正在测试一个特定的位,仅此而已。如果该位已设置,结果将为非零(按位和)。如果未设置该位,结果将为零

什么时候会出错?如果使用的标志不是2的幂,那么每个值都将设置多个位,这使得执行这些检查变得很困难

例如,假设您有以下定义:

enum designFlags {
    BOLD = 2,
    ITALICS = 4,
    UNDERLINE = 6
};
然后将设计设置为
下划线

myDesign = UNDERLINE
以下测试的结果是什么

myDesign & BOLD
myDesign & ITALICS
这对他们两人来说都将是非零的,肯定是一种不受欢迎的行为

当然,您可以执行以下操作:

if ((myDesign & BOLD) == BOLD) {
    ...

但是我宁愿只使用一个位设置的标志。

什么编译错误?请复制并粘贴到这里。
BOLD |下划线
不一定是有效的
designFlags
值。为什么不将
myDesign
改为
int
呢?
designFlags
是标志的组合,所以应该声明为int.@alterigel的可能副本对于非作用域枚举,有效值是可表示枚举数的值的范围。枚举数需要3位来表示,因此任何3位值都是有效的-无论它们是否显式命名为枚举值。
BOLD | UNDERLINE
绝对有效。为什么
myDesignGrand 大多数时候都是正确的?当它出错的时候会是什么情况?”安德烈我用一些评论更新了我的答案,希望它有帮助!啊,没有考虑多位标志,谢谢!
if ((myDesign & BOLD) == BOLD) {
    ...