C++中bool的默认值

vot*_*ake 13 c++ boolean

我正在用C++重新设计一个类构造函数,需要它来捕获一个未指定的bool.我已经为所有其他参数使用了默认值,但是根据我的理解,bool只能初始化为true或false.由于这两种情况都在类中有意义,我应该如何处理从默认值检查更改?

Ste*_*eld 40

现实是你不能这样做.bool具有值,无论是true还是false,如果您尚未初始化它,则它是随机的true或false,在程序的每次运行或该类的分配时可能不同.

如果需要具有更多选项的类型,请定义枚举.

typedef enum MyBool {
    TRUE,
    FALSE,
    FILENOTFOUND
} MyBool;
Run Code Online (Sandbox Code Playgroud)

  • 好的触摸有TRUE == false和FALSE == true. (72认同)
  • 从thedailywtf.com被盗?:) (16认同)
  • 如果你没有初始化bool,那么它甚至可以*既不是*true*也不是*false,这确实非常邪恶(未定义). (6认同)
  • 有趣的DailyWTF参考. (4认同)

Dan*_*nas 36

三态布尔是走向黑暗面的道路.三态布尔导致愤怒.愤怒导致仇恨.仇恨导致痛苦.


不想使用三态布尔.

相反,使用一个额外的布尔值来判断第一个布尔值是否"初始化"(或更好,"已知").

class Prisoner : public Person
{


  ...

  bool is_veredict_known;
  bool is_guilty;
}
Run Code Online (Sandbox Code Playgroud)

如果尚不知道veredict,你无法判断囚犯是否真的有罪,但你的代码可以区分不同的情况.当然宪法保证is_guilty的默认值应该是假的,但是,仍然......

顺便说一下,类不变量应该包括:

assert(is_veredict_known || !is_guilty);
Run Code Online (Sandbox Code Playgroud)


Jos*_*ley 18

听起来你想要boost :: tribool或者boost :: optional <bool>.

  • 您甚至可以为DailyWTF需求设置boost :: tribool:BOOST_TRIBOOL_THIRD_STATE(FILENOTFOUND). (6认同)

Jar*_*Par 5

如果这是您需要的,请创建一个值,该值表示可能尚未初始化的值的概念.

template <typename T>
struct Maybe {
  Maybe() : m_hasValue(false) {}
  bool HasValue() const { return m_hasValue; }
  T& Value() { ThrowIfFalse(m_hasValue); return m_value; }
  const T& Value() const { ThrowIfFalse(m_hasValue); return m_value; }
  void SetValue( _In_ const T& value) { m_value = value; m_hasValue = true; }
private:
  bool m_hasValue;
  T m_value;
};
Run Code Online (Sandbox Code Playgroud)

现在您可以代表您需要的所有3个州.

class SomeType { 
  ...
  Maybe<bool> m_myBool;
}
Run Code Online (Sandbox Code Playgroud)

  • +1:如果C++有闭包会更好.我猜你可以用函数指针模拟它们.(PS:不喜欢班级名称). (2认同)