为std :: exeption_ptr隐式转换为bool

时间:2017-05-02 15:15:29

标签: c++ c++11

我正在编写一些代码,需要我缓存异常。

请考虑

int main()
{
    std::exception_ptr ex;
    bool b = ex;
}

由于ex无法转换为bool类型,因此无法编译。我目前的解决方法是编写

bool b = !!ex;

甚至

bool b = ex ? true : false;

第一种方式是丑陋的,第二种方式肯定是重言式。我开始责怪编译器(MSVC2015)。两件事:

  1. 有没有更好的方法来检查ex是否已设置为例外?

  2. (相关)我是否需要以某种方式初始化ex

2 个答案:

答案 0 :(得分:2)

阅读the documentation

禁止隐式转换,但明确的转换不是。

  

std :: exception_ptr不能隐式转换为任何算术,枚举或指针类型。它在上下文中可以转换为bool,如果为null则将其计算为false,否则为true。

因此,当您显式转换表达式时它会起作用,但是当您尝试隐式转换时,即在bool 复制初始化中时,它不会起作用。

更好的解决方案是直接初始化bool

bool b{ex};

你的P45在帖子里;希望您在下一份工作中查阅文档。 ;)

答案 1 :(得分:1)

类型File exists 是可空的,这意味着当它默认构造时,默认情况下它是一个空值。因为这是一个typedef并且不是必然一个原始指针,所以它不能直接分配给bool,因为这会隐式转换类型。

您可以检查它是否已按照您的设置进行设置,或者您可以使用std::exception_ptr或者将其明确地转换为布尔值来更干净地进行设置:

nullptr

明确施法:

std::exception_ptr e;
bool isNull = false;

if(e == nullptr)
  isNull = true;