-1

考虑以下代码:

enum TestEnum
{
   TEST_ENUM_5 = 5
};

class Test
{
public:
   Test() { mType = TEST_ENUM_5; mVal = 1; }
   TestEnum& type() { return (TestEnum&)mType; }

private:
   uint16_t mType;
   uint16_t mVal;
};

int main( int argc, const char* argv[] )
{
   Test test;
   assert( test.type() == TEST_ENUM_5 );
}

该程序使用 MSVC 2010 编译良好 - 没有错误或警告。但断言失败 - 返回的值不是 5,而是 0x00010005。

换句话说,返回的枚举值被解释为一个 4 字节的值 - 包括以下短的内容。我可以看到编译器为什么要这样做,引用是对 mType 地址的引用,并且正在加载接下来的 4 个字节的寄存器。

但这对编译器来说是正确的行为吗?

它不应该知道 TestEnum& 是对 16 位数量的引用吗?或者如果它不想这样做,它不应该发出警告吗?

除此之外,我想做的是将一个简短的枚举存储到一个 16 位值中,并具有返回对它的引用的方法,该方法被键入为 typedef。从逻辑上讲,我想要的是一个允许我执行以下操作的界面:

test.type() = TEST_ENUM_5;

并让它在编译时知道只有来自 TestEnum 的值是预期的。就此而言,我希望该类的用户在阅读它时知道此处需要 TestEnum 值。

4

2 回答 2

1

你说枚举必须是两个字节,并且返回类型type()必须是枚举引用。

C++11 有一个特性,你可以指定枚举的底层类型:

enum TestEnum : unsigned short
{
   TEST_ENUM_5 = 5
};

   TestEnum& type() { return mType; }
private:
   TestEnum mType;
于 2012-10-26T16:32:23.980 回答
0

好吧,如果您需要这样的用法test.type() = TEST_ENUM_5;,只需正确实现它:

   Test() { mType = TEST_ENUM_5; mVal = 1; }
   TestEnum& type() { return mType; }

private:
   TestEnum mType;

更新: “2 字节”版本:

   Test() { mType = TEST_ENUM_5; mVal = 1; }
   uint16_t& type() { return mType; }

private:
   uint16_t mType;
于 2012-10-26T16:24:41.263 回答