|
未区分范围的枚举常量可以隐式转换为 int,但是 int 不可以隐式转换为枚举值。 下面的示例显示了如果尝试为 hand 分配一个不是 Suit 的值可能出现的情况:
int account_num = 135692;
Suit hand;
hand = account_num; // error C2440: '=' : cannot convert from 'int' to 'Suit'
将 int 转换为区分范围或未区分范围的枚举器时,需要强制转换。 但是,你可以将区分范围的枚举器提升为整数值,而不进行强制转换。
int account_num = Hearts; //OK if Hearts is in an unscoped enum
按照这种方式使用隐式转换可能导致意外副作用。 若要帮助消除与区分范围的枚举相关的编程错误,区分范围的枚举值必须是强类型值。 区分范围的枚举器必须由枚举类型名称(标识符)限定,并且无法进行隐式转换,如以下示例所示:
namespace ScopedEnumConversions
{
enum class Suit { Diamonds, Hearts, Clubs, Spades };
void AttemptConversions()
{
Suit hand;
hand = Clubs; // error C2065: 'Clubs' : undeclared identifier
hand = Suit::Clubs; //Correct.
int account_num = 135692;
hand = account_num; // error C2440: '=' : cannot convert from 'int' to 'Suit'
hand = static_cast<Suit>(account_num); // OK, but probably a bug!!!
account_num = Suit::Hearts; // error C2440: '=' : cannot convert from 'Suit' to 'int'
account_num = static_cast<int>(Suit::Hearts); // OK
}
}
注意,hand = account_num; 行仍会导致对未区分范围的枚举发生的错误,如前面所示。 它可以与显式强制转换一起使用。 但是,借助区分范围的枚举,不再允许在没有显式强制转换的情况下在下一条语句 account_num = Suit::Hearts; 中尝试转换。
|
|