C++ 用于错误检查的转换功能是否良好?
我想有一个简单的方法来检查一个对象是否有效。我想到了一个简单的转换函数,类似这样:C++ 用于错误检查的转换功能是否良好?,c++,error-handling,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; //我的对象无效吗? 如果(!my_object)std::cerr否,则简单的布尔转换
operator bool() const { return is_valid; }
现在检查它是否有效将非常简单
// is my object invalid?
if (!my_object) std::cerr << "my_object isn't valid" << std::endl;
//我的对象无效吗?
如果(!my_object)std::cerr否,则简单的布尔转换运算符为非,因为您现在可以在不相关的类型之间进行邪恶的比较。一般来说,是的,转换函数是可以的。只需使用()。我无法比给定的链接更好地解释它。在C++03中,您需要使用来避免邪恶的事情:
int x = my_object; // this works
在C++11中,可以使用显式转换:
explicit operator bool() const
{
// verify if valid
return is_valid;
}
这样,你需要明确的转换到BoOL,这样你就不会再做疯狂的事情了(C++中你总是可以故意做一些疯狂的事情):
这在需要布尔表达式的if
和while
中仍然正常工作,因为这些语句的条件在上下文中转换为bool:
这在第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的地方如下:
if
、while
和for
语句的条件李>
- 逻辑求反的运算符
代码>、逻辑连词&&
、逻辑析取|
李>
- 条件运算符
?:
李>
静态断言的条件
李>
noexcept
异常说明符的可选常量表达式李>
原来的问题是
这被认为是一种好的做法吗
安全布尔转换的问题在实践中非常重要,但幸运的是,现在已经由标准解决了
但这种方法是否合适的判断是一个设计问题
通过引入这样一种“有效性检查”,实际上就是说明对象可能处于无效状态。也就是说,从计算机科学的角度来说,您为对象所表示的值域添加了一个新的独立值。所谓的底值
具有该属性的值域的最突出示例是指针。指针可以引用各种内存位置,但也可以是
NULL
(无效)
因此,我们需要问自己:这样一个底部值真的反映了我们想要用类建模的事物的本质吗?我们真的需要在我们的模型中涵盖这方面的本质吗
经验表明,底价往往容易出错,容易忘记,通常是负债而不是资产。如果您能够以对象不会无效的方式排列代码,那么您的代码将变得更简单、更易于阅读、理解和维护。很高兴知道如果等进行了显式转换!有标准参考吗?当然不仅仅是代码>这样就可以了吗?:)“使用显性转换”隐含“”我喜欢这个说法,这是一个很好的悖论。“所以你不能再做疯狂的事情偶然(在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
// this uses the explicit conversion "implicitly"
if (my_object)
{
...
}