我很想知道將例外物件移動到某個區域變數是否正確。這個動作有沒有可能導致UB?我的擔憂是由于通過參考捕獲假設訪問位于其他位置的例外物件(因為它必須一直存在到堆疊展開結束)。請參閱下面的示例。
int main()
{
std::pair<int,int> res; //may be heavy object, it's only example
int a[3][5];// assume filled
try
{
for(int i = 0; i < 3; i)
{
for(int j = 0; j < 5; j)
{
if(a[i][j] % 2 ==0 )
{
throw std::pair<int,int>(i,j);
}
}
}
}catch(std::pair<int,int>& pair)
{
res = std::move(pair);
}
}
uj5u.com熱心網友回復:
移出的物件仍處于有效狀態。
即使您通過 重新拋出例外throw;并再次捕獲它,它也會起作用。
對于處于有效但未指定狀態的物件(假設您使用這樣的物件而不是一對整數),結果可能出乎意料,但仍然沒有 UB。
uj5u.com熱心網友回復:
由于您的代碼沒有通過為預期結果拋出例外來遵循良好實踐,因此問題的答案實際上并不重要,因為無論如何您都應該重寫代碼......
這是一個關于如何撰寫此類代碼的示例。
#include <utility>
std::pair<int, int> find(int(&a)[3][5])
{
for (int i = 0; i < 3; i)
{
for (int j = 0; j < 5; j)
{
if (a[i][j] % 2 == 0)
{
return std::pair<int, int>(i, j);
}
}
}
return {};
}
int main()
{
int a[3][5];// assume filled
auto res = find(a);
}
雖然您的初始代碼可以作業,但拋出和捕獲例外可能會很慢,因此即使移動,您的代碼也可能比不使用例外回傳結果的版本慢。
一個好的做法是僅對意外錯誤使用例外。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/391892.html
