无法使用 'int' 类型的右值初始化 'designFlags' 类型的变量
cannot initialize a variable of type 'designFlags' with an rvalue of type 'int'
我正在尝试创建一个枚举标志,用于查看某项内容是否为粗体和斜体,但出现编译错误:
错误:无法使用 '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;
}
C++ 标准阻止您执行从 int
到 enum
的隐式转换(注意:允许从 enum
到 int
的隐式转换)。
但是,您可以改为执行静态转换:
designFlags myDesign = static_cast<designFlags>(BOLD | UNDERLINE);
cout << myDesign; // prints 5
请记住,结果值很可能不是 designFlags
中指定的值之一。这通常是一种常见的做法,但您必须依靠 bit-wise 操作来执行比较:
例如:
// wrong
if (myDesign == BOLD)
// ok (most of the time)
if (myDesign & BOLD)
// always ok
if ((myDesign & BOLD) == BOLD)
更新:为什么 myDesign & BOLD
大多数时候都正常?
当您使用标志时,值必须是 2 的幂:1、2、4、8 等。因此,每个可能的值都只设置了一个位,并且每个位都不同。
然后,当您执行 myDesign & BOLD
时,您正在测试一个特定位,仅此而已。如果设置了该位,则结果将为 non-zero(按位与)。如果未设置该位,则结果将为零。
什么时候会出错?好吧,如果您使用的标志不是 2 的幂,则每个单独的值都将设置不止一位,从而难以执行这些检查。
例如,假设您有以下定义:
enum designFlags {
BOLD = 2,
ITALICS = 4,
UNDERLINE = 6
};
然后将设计设置为 UNDERLINE
:
myDesign = UNDERLINE
以下测试的结果是什么?
myDesign & BOLD
myDesign & ITALICS
这对他们两个来说都是 non-zero,这肯定是一种不受欢迎的行为。
当然你可以这样做:
if ((myDesign & BOLD) == BOLD) {
...
但我宁愿使用仅设置一位的标志。
我正在尝试创建一个枚举标志,用于查看某项内容是否为粗体和斜体,但出现编译错误: 错误:无法使用 '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;
}
C++ 标准阻止您执行从 int
到 enum
的隐式转换(注意:允许从 enum
到 int
的隐式转换)。
但是,您可以改为执行静态转换:
designFlags myDesign = static_cast<designFlags>(BOLD | UNDERLINE);
cout << myDesign; // prints 5
请记住,结果值很可能不是 designFlags
中指定的值之一。这通常是一种常见的做法,但您必须依靠 bit-wise 操作来执行比较:
例如:
// wrong
if (myDesign == BOLD)
// ok (most of the time)
if (myDesign & BOLD)
// always ok
if ((myDesign & BOLD) == BOLD)
更新:为什么 myDesign & BOLD
大多数时候都正常?
当您使用标志时,值必须是 2 的幂:1、2、4、8 等。因此,每个可能的值都只设置了一个位,并且每个位都不同。
然后,当您执行 myDesign & BOLD
时,您正在测试一个特定位,仅此而已。如果设置了该位,则结果将为 non-zero(按位与)。如果未设置该位,则结果将为零。
什么时候会出错?好吧,如果您使用的标志不是 2 的幂,则每个单独的值都将设置不止一位,从而难以执行这些检查。
例如,假设您有以下定义:
enum designFlags {
BOLD = 2,
ITALICS = 4,
UNDERLINE = 6
};
然后将设计设置为 UNDERLINE
:
myDesign = UNDERLINE
以下测试的结果是什么?
myDesign & BOLD
myDesign & ITALICS
这对他们两个来说都是 non-zero,这肯定是一种不受欢迎的行为。
当然你可以这样做:
if ((myDesign & BOLD) == BOLD) {
...
但我宁愿使用仅设置一位的标志。