C++ 如何处理 try catch 块中的赋值?

How does C++ treat assignments in try catch blocks?

我使用 clang 分析器检查我的 C++ 代码是否存在缺陷和错误。我有以下构造:

#include <cstdlib>
#include <iostream>

double
somethingThatMayThrow() throw (std::exception)
{
   if( rand() % 2 ) {
      throw std::exception();
   }
   return 5.0;
}

int
main()
{
   double value = 2.0;
   try {
      value = somethingThatMayThrow();
   } catch( const std::exception& ) {
      std::cout << "oops" << std::endl;
   }
   double someOtherValue = value + 1.0;

   std::cout << someOtherValue << std::endl;

   return 0;
}

分析器现在抱怨从未读取变量 value 的初始值。但是,很明显,当且仅当 try 块中出现异常时,该值才会在最后一行中使用。这种理解是否正确,我是否在查看分析器中的错误?还是我在这里遗漏了什么?

标准如何定义这种行为?如果右侧抛出,赋值的左侧会发生什么情况?

下面的屏幕截图显示了分析器抱怨的实际代码,其结构与我上面的示例相同:

分析器错误。你是对的。

如果 try 块中的代码永远不会抛出 std::exceptions 或从它派生的类型的对象(例如 noexcept 或仅抛出其他类型的对象),则分析器可能是正确的被抛出)。

无论哪种方式,您的解释都是正确的:如果对待定值的求值抛出,则永远不会发生赋值。因此,原始值将保持不变。

编译器发现您在 value 的初始化中分配了 someValue,但随后在 try 块内,您正在重新分配它。

并且分析器在没有抛出异常的情况下是正确的,但在相反的情况下,value 仍然与原始 someValue 相同。