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异常说明符的可选常量表达式;