的错误检查转换功能被认为是好吗?

我想要一种简单的方法来检查对象是否有效。 我想到了一个简单的转换函数,如下所示:

operator bool() const { return is_valid; }

现在检查它是否有效非常简单

// is my object invalid?
if (!my_object) std::cerr << "my_object isn't valid" << std::endl;

这是一个好习惯吗?

Karl von Moor asked 2020-02-13T22:02:08Z
3个解决方案
66 votes

在C ++ 03中,您需要使用安全的布尔习惯用法来避免邪恶的事情:

int x = my_object; // this works

在C ++ 11中,可以使用显式转换:

explicit operator bool() const
{
    // verify if valid
    return is_valid;
}

这样,您需要明确地转换为bool,这样您就不能再偶然地做疯狂的事情(在C ++中,您总是可以故意做疯狂的事情):

int x = my_object; // does not compile because there's no explicit conversion
bool y = bool(my_object); // an explicit conversion does the trick

在需要布尔表达式的noexcept&&之类的地方,这仍然可以正常工作,因为这些语句的条件在上下文中转换为bool:

// this uses the explicit conversion "implicitly"
if (my_object)
{
    ...
}

§4[conv]中对此进行了说明:

表达式noexcept可以隐式包含   仅当且仅当转换为&&类型   声明||格式正确,   对于一些发明的临时变量t   (第8.5节)。 某些语言构造   要求表达   转换为布尔值。 一个   表达式e出现在这样的   上下文被称为上下文转换为noexcept,并且格式正确   当且仅当声明bool t(e);的格式正确时,   发明了临时变量t(第8.5节)。 任一个的效果   隐式转换与执行   声明和初始化,然后使用临时   转换后的变量。

(区别在于使用noexcept而不是&&。)

上下文转换为布尔发生的地方是:

  • noexcept&&||语句的条件;
  • 逻辑否定运算符noexcept,逻辑合取&&和逻辑析取运算||的运算符;
  • 条件运算符noexcept;
  • noexcept的状况;
  • noexcept异常说明符的可选常量表达式;
R. Martinho Fernandes answered 2020-02-13T22:03:16Z
12 votes

不,不是简单的布尔转换运算符,因为您现在可以在不相关的类型之间进行邪恶的比较。 通常,是的,转换函数是可以的。 只需使用正确的方法(安全布尔习语)即可。 我不能比给定的链接更好地解释它。

Xeo answered 2020-02-13T22:03:37Z
0 votes

最初的问题是

这是一个好习惯吗?

安全布尔转换的问题在实践中非常相关,但幸运的是,现在这些标准已解决了该问题。

但是这种方法是否合适的判断是设计问题。

通过引入这种“有效性检查”,可以有效地说明您的对象可能处于无效状态。 也就是说,用计算机科学的术语来说,您将新的单独值添加到了由对象表示的值域中。 所谓的底值

具有该属性的值域的最突出示例是指针。 指针可以引用各种内存位置,但也可以是NULL(无效)。

因此,我们需要问自己:这样的底值是否真的反映了我们要在我们的类中建模的事物的本质?–我们真的需要在模型中涵盖本质的这一方面吗?

经验表明,底值往往容易出错,容易忘记,并且通常比资产具有更多的负债。 如果您能够以不会使对象无效的方式来安排代码,则代码将变得更简单,更易于阅读,理解和维护。

Ichthyo answered 2020-02-13T22:04:29Z
translate from https://stackoverflow.com:/questions/6242296/conversion-function-for-error-checking-considered-good