错误检查的转换function被认为是好的?
我想有一个简单的方法来检查一个对象是有效的。 我想到了一个简单的转换函数,像这样:
operator bool() const { return is_valid; }
检查它是有效的,现在是非常简单的
// is my object invalid? if (!my_object) std::cerr << "my_object isn't valid" << std::endl;
这被认为是一个好的做法?
在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
这在像if
和while
这样的需要布尔expression式的地方仍然是正常的,因为这些语句的条件被上下文转换为bool:
// this uses the explicit conversion "implicitly" if (my_object) { ... }
这在§4[conv]中有logging :
一个expression式
e
可以被隐含地转换为一个typesT
当且仅当声明T t=e;
对于一些发明的临时variablest
(§8.5)来说,是格式良好的。 某些语言结构要求将expression式转换为布尔值。 出现在这样的语境中的expression式e
据说被上下文转换为bool
,并且当且仅当声明bool t(e);
对于一些发明的临时variablest
(§8.5)来说,是格式良好的。 隐式转换的效果与执行声明和初始化相同,然后使用临时variables作为转换的结果。
(有什么不同的是使用bool t(e);
而不是bool t = e;
)
这个地方是这种情况转换为布尔发生的是:
-
if
,while
和for
语句的条件; - 逻辑否定的操作符
!
,逻辑连接&&
和逻辑断开||
; - 条件运算符
?:
-
static_assert
的条件; -
noexcept
exception说明符的可选常量expression式;
不 ,一个简单的布尔转换运算符不是 ,因为你现在可以在不相关的types之间进行恶意比较。 一般来说,是的,转换function是好的。 只要使用正确的 ( 安全布尔成语 )。 我不能解释它比给定的链接更好。
原来的问题是
这被认为是一个好的做法?
安全布尔转换的问题在实践中是非常相关的,幸好标准已经解决了。
但判断这种方法是否恰当,是一个devise问题。
通过引入这样的“有效性检查”,实际上你说的是你的对象可能处于无效状态。 也就是说,用计算机科学的术语来说,你为你的对象所代表的价值领域增加了一个新的单独的价值。 所谓的最低价值
指针是一个值域的最显着的例子。 指针可以指向不同的内存位置,但也可以是NULL
(无效)。
因此,我们需要自问:这样一个底部的价值是否真的反映了我们想要用我们的阶级模型化的事物的本质 – 而且我们是否真的需要在我们的模型中涵盖这个自然界的这个方面呢?
经验表明,最低价值倾向于容易出错,容易被遗忘,通常更多的是责任而不是资产。 如果你能够以你的对象不能无效的方式来安排你的代码,你的代码变得更简单,更易于阅读,理解和维护。