2012-11-12 85 views
7

的範圍。當包裝恆定我經常碰到範圍的初始化問題try塊限制常數變量

try { 
    const int value = might_throw(); 
} 
std::cout << value << "\n"; /* error, value out of scope */ 

目前我使用的臨時值作爲一種變通方法。有沒有更好的方法來處理const - try {}的情況?

int tmp; /* I'd rather have tmp const */ 
try { 
    tmp = might_throw(); 
} 
catch (...) { 
    /* do something */ 
} 
const int value = tmp; 
+4

在try塊中不使用變量的原因是什麼? –

+0

該變量可能在try塊之後的許多行中使用。你是說我應該放大我的try塊來包含所有東西,即使它包含許多隻與使用變量相關的代碼行嗎? –

+0

不一定。我只是想讓(可能)最簡單的解決方案成爲現實。我同意在某些情況下這是一個問題。 –

回答

9

而不是你的

int tmp; /* I'd rather have tmp const */ 
try { 
    tmp = might_throw(); 
} 
catch (...) { 
    /* do something */ 
} 
const int value = tmp; 

,你可以這樣做:

int int_value() 
{ 
    try { 
     return might_throw(); 
    } 
    catch (...) { 
     /* do something */ 
     return the_something_value; 
    } 
} 

int main() 
{ 
    int const value = int_value(); 
} 

或者,在C++ 11,你可以做

int main() 
{ 
    int const value = []() -> int { 
     try { 
      return might_throw(); 
     } 
     catch (...) { 
      /* do something */ 
      return the_something_value; 
     } 
    }(); 
} 
0
try { 
    const int value = might_throw(); 
    std::cout << value << '\n'; 
} 
catch (...) { 
    std::cout << "threw instead of giving me a value :(\n"; 
} 

try是有原因的一個範圍塊!

如果你做的遠遠超過std::coutvalue那麼,是的,它會變得有點混亂。然後,你有一個選擇:

  • 丟棄const
  • 包圍,在try使用value所有邏輯,或
  • 初始化由函數int mightThrowWrapper(int default = 0)返回的值const int本身包裹嘗試/ catch並返回一個默認的拋出。那麼你已經得到了你的本地化異常處理const ness!
3

對我來說,這看起來像一個功能的情況:

int const value = []()->int { 
    try { return might_throw(); } 
    catch (...) { return come_up_with_a_value_differently(); } 
}(); 
+1

我想你最後錯過了'()'。 –

+0

@ChristianRau:好點:我創建了一個函數對象,但也有必要調用它。我已經添加了它們。謝謝! –