【问题标题】:Forward declared enum, default value in .h转发声明的枚举,.h 中的默认值
【发布时间】:2018-08-02 11:54:43
【问题描述】:

Types.h:

enum MyEnum : int8
{
    invalid = -1,
    valid = 0,
}

class TestClass 
{ ... default stuff ...}

MyOtherHeader.h:

enum MyEnum : int8;
class TestClass;

class MyClass
{
    MyEnum Val = -1;
    TestClass* MyObj= nullptr;
}

为什么我们可以将null 分配给转发声明的类指针,但不能将enum 的已定义基础类型的值分配给转发声明的类指针?

编译器不应该能够正确“推断”吗?

TLDR:问题是:为什么我们需要解决方法来为前向声明的枚举属性分配一个默认值?

【问题讨论】:

  • Define "can't assign a value" 你得到编译错误吗?如果是这样,请复制粘贴其文本。
  • MyEnum Val{-1}; 被 gcc/clang Demo 接受。
  • 声明不透明并不重要。即使看到枚举器,您也无法分配 -1。西蒙的答案有你的解决方法。
  • 问题不是,什么是解决方法,而是为什么我们需要解决方法?
  • 整数和枚举数之间没有隐式转换。从来没有。

标签: c++ c++11 enums


【解决方案1】:

没有从 int 到枚举的隐式转换。因此,您不能 copy-initialize(使用 =)来自 int 的枚举。所以即使这样

enum MyEnum : int8
{
    invalid = -1,
    valid = 0,
};

MyEnum e = -1;

会产生同样的错误。您可以添加演员表,或切换到direct-initialization(演员表也是一种形式,在这里):

MyEnum e{-1};

上面直接初始化了变量,但遗憾的是只从 C++17 开始。在我们的特殊情况下,如果您可以使用支持 C++17 的编译器,您可以使用它为您的成员提供default member initializer。否则,强制转换是为整数枚举提供初始化器的唯一方法。

【讨论】:

  • 仅允许从整数进行列表初始化(并且仅从 C++17 开始)。
  • @Jarod42 - 是的,你是对的。我有时忘记现在几点了。
猜你喜欢
  • 2016-11-17
  • 2023-02-22
  • 2011-10-27
  • 2016-10-10
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
相关资源
最近更新 更多