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

时间:2011-06-05 10:18:14

标签: c++ error-handling

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

operator bool() const { return is_valid; }

现在检查它是否有效

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

这被认为是一种好习惯吗?

3 个答案:

答案 0 :(得分:64)

在C ++ 03中,您需要使用safe bool idiom来避免恶意:

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

这在ifwhile等需要布尔表达式的地方仍然正常,因为这些语句的条件是从上下文转换到bool:

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

§4[conv]

中记录了这一点
  

表达式e可以隐含   当且仅当,将转换为类型T   宣言T t=e;格式正确,   对于一些发明的临时变量t   (第8.5节)。某些语言结构   要求表达式   转换为布尔值。一个   表达式e出现在这样的表达中   上下文被称为在上下文中转换为bool 并且格式正确   当且仅当声明bool t(e);格式正确时,对某些人而言   发明了临时变量t(§8.5)。任何一个的影响   隐式转换与执行相同   声明和初始化然后使用临时   作为转换的结果变量。

(区别在于使用bool t(e);代替bool t = e;。)

这个地方是bool发生的上下文转换是:

  • ifwhilefor陈述的条件;
  • 逻辑否定的运算符!,逻辑结合&&和逻辑分离||;
  • 条件运算符?:;
  • static_assert;
  • 的条件
  • noexcept异常说明符的可选常量表达式;

答案 1 :(得分:12)

,一个简单的bool转换运算符,因为您现在可以在不相关的类型之间进行恶意比较 。通常,是的,转换功能是可以的。只需使用the right onesafe-bool idiom)即可。我无法解释它比给定的链接更好。

答案 2 :(得分:0)

最初的问题是

  

这被认为是一种好习惯吗?

安全布尔转换的问题在实践中非常重要,但幸运的是,标准已经解决了这个问题。

但判断这种方法是否恰当,是一个设计问题。

通过引入这样的&#34;有效性检查&#34;,有效地说明您的对象可能处于无效状态。也就是说,在计算机科学术语中,您为对象所代表的值域添加了一个新的单独值。所谓的底值

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

因此,我们需要问自己:这样一个底层值是否真正反映了我们想要用我们的类建立的事物的性质 - - 我们是否真的需要涵盖这方面的我们模型中的本质?

经验表明,最低价值往往容易出错,容易被遗忘,而且通常比资产更多的是负债。如果您能够以对象无效的方式安排代码,您的代码将变得更简单,更易于阅读,理解和维护。