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

Kar*_*oor 49 c++ error-handling

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

operator bool() const { return is_valid; }
Run Code Online (Sandbox Code Playgroud)

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

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

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

R. *_*des 67

在C++ 03中,你需要使用安全bool习语来避免恶意:

int x = my_object; // this works
Run Code Online (Sandbox Code Playgroud)

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

explicit operator bool() const
{
    // verify if valid
    return is_valid;
}
Run Code Online (Sandbox Code Playgroud)

这样你就需要明确转换为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
Run Code Online (Sandbox Code Playgroud)

这仍然可以作为正常的像的地方if,并while需要一个布尔表达式,因为这些语句的条件上下文转换为BOOL:

// this uses the explicit conversion "implicitly"
if (my_object)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这在§4[conv]中有记录:

对于某些发明的临时变量 (第8.5节),当且仅当声明格式正确时,表达式e才能隐式转换为类型.某些语言结构要求将表达式转换为布尔值.对于某些发明的临时变量(§8.5),当且仅当声明格式正确时,出现在这样的上下文中的表达被称为在上下文中被转换为并且格式良好.隐式转换的效果与执行声明和初始化相同,然后使用临时变量作为转换的结果.TT t=e;teboolbool t(e);t

(与众不同的是使用bool t(e);而不是bool t = e;.)

这种情况是这种情境转换为bool发生的是:

  • 的条件if,while以及for报表;
  • 逻辑否定!,逻辑连接&&和逻辑分离的运算符||;
  • 条件运算符?:;
  • 的条件static_assert;
  • noexcept异常说明符的可选常量表达式;

  • "隐式使用显式转换" - 我喜欢这种说法,这是一个很好的悖论. (5认同)

Xeo*_*Xeo 12

,一个简单的bool转换运算符不是,因为你现在可以在不相关的类型之间进行恶意比较.通常,是的,转换功能是可以的.只需使用正确的(安全布尔成语).我无法解释它比给定的链接更好.