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)
      {
          ...
      }