LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 270|回复: 0

强制转换规则

[复制链接]
发表于 2024-1-31 22:45:00 | 显示全部楼层 |阅读模式
未区分范围的枚举常量可以隐式转换为 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; 中尝试转换。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表