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::exception
s 或从它派生的类型的对象(例如 noexcept
或仅抛出其他类型的对象),则分析器可能是正确的被抛出)。
无论哪种方式,您的解释都是正确的:如果对待定值的求值抛出,则永远不会发生赋值。因此,原始值将保持不变。
编译器发现您在 value
的初始化中分配了 someValue
,但随后在 try
块内,您正在重新分配它。
并且分析器在没有抛出异常的情况下是正确的,但在相反的情况下,value
仍然与原始 someValue
相同。
我使用 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::exception
s 或从它派生的类型的对象(例如 noexcept
或仅抛出其他类型的对象),则分析器可能是正确的被抛出)。
无论哪种方式,您的解释都是正确的:如果对待定值的求值抛出,则永远不会发生赋值。因此,原始值将保持不变。
编译器发现您在 value
的初始化中分配了 someValue
,但随后在 try
块内,您正在重新分配它。
并且分析器在没有抛出异常的情况下是正确的,但在相反的情况下,value
仍然与原始 someValue
相同。