C++ 如何在对int和作用域枚举的引用之间进行静态转换?

C++ 如何在对int和作用域枚举的引用之间进行静态转换?,c++,C++,我有以下枚举和输入流运算符: enum class MsrEncryptionStatus : unsigned char { Unknown = 0xFF, None = 0, Ksn, Dukpt, Other }; inline std::istream& operator>>(std::istream& s, MsrEncryptionStatus& status) { return s >> stat

我有以下枚举和输入流运算符:

enum class MsrEncryptionStatus : unsigned char
{
   Unknown = 0xFF,
   None = 0,
   Ksn,
   Dukpt,
   Other
};

inline std::istream& operator>>(std::istream& s, MsrEncryptionStatus& status)
{
   return s >> static_cast<unsigned&>(status);
}

我试图做的是避免定义一个变量来临时保存输入流中的值,然后再
static\u cast
。有人能帮我理解我在这里遗漏了什么吗?我觉得我缺少了如何对左值进行静态转换的一个基本部分,例如,它感觉这里正在创建一个临时变量,如果这是真的,我就不能将它绑定到一个非常量左值引用。

我的编译器也拒绝进行静态转换,但临时变量还是更好,由于你的其他义务

您需要读取该值,根据MsrEncryptionStatus对其进行验证,然后将其分配到状态,或设置故障位

以下是推荐的CPPPreference模板

std::istream& operator>>(std::istream& is, T& obj)
{
    // read obj from stream
    if( /* T could not be constructed */ )
        is.setstate(std::ios::failbit);
    return is;
}

没有从MsrEncryptionStatus到unsigned int&的安全转换。这就是静态_cast失败的原因。 如果您完全确定自己在做什么,可以使用reinterpret_cast

在下一个示例中,我将向您展示重新解释投射的危险性:

int main()
{
std::ifstream i(“input.dat”);
未签名的a;
无符号字符b;
i>>a;
我>>重新解释演员阵容(b);//我写这篇文章的时候在想什么?

std::你为什么不在你的枚举类上定义一个操作符>>?使用临时操作符到底有什么错?我还想知道你是否可以做一些疯狂的事情,比如:
模板内联类型名std::enable_if::type operator>>(std::istream&s,E&E){typename std::底层类型::type tmp;s>>tmp;E=static_cast(tmp);return s;}
它实际上也不允许您将其转换为正确的类型。不止这些。@KennyOstrom我的错误!谢谢。如果我没有看到其他问题,请告诉我。我只是想表明,如果输入流已经验证,并且“status”引用的内存足够大,他可以使用reinterpret\u cast。
std::istream& operator>>(std::istream& is, T& obj)
{
    // read obj from stream
    if( /* T could not be constructed */ )
        is.setstate(std::ios::failbit);
    return is;
}
1234 5678
22 .