2012-11-12 34 views
7

Khi gói initializations của một hằng số tôi thường xuyên chạy vào phạm vi vấn đềthử giới hạn khối phạm vi biến const

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

Hiện nay tôi sử dụng một giá trị tạm thời như một cách giải quyết. Có cách nào tốt hơn để xử lý các tình huống const - try {} không?

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

Lý do không sử dụng biến trong khối thử là gì? –

+0

Biến có thể được sử dụng trong nhiều dòng theo khối thử. Bạn có nói rằng tôi nên mở rộng khối thử của tôi để kèm theo tất cả mọi thứ, ngay cả khi bao gồm nhiều dòng mã chỉ liên quan đến việc sử dụng biến? –

+0

Không nhất thiết. Tôi chỉ muốn có được giải pháp dễ nhất (có khả năng). Tôi đồng ý rằng đó là một vấn đề trong một số trường hợp. –

Trả lời

9

Thay vì bạn

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

bạn có thể làm điều này:

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

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

Hoặc, trong C++ 11 bạn có thể làm

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 là một khối phạm vi cho một lý do!

Nếu bạn đang thực hiện nhiều hơn một số std::cout với value thì, vâng, nó hơi lộn xộn hơn một chút. Sau đó, bạn có thể lựa chọn:

  • thả const,
  • bọc tất cả logic sử dụng value trong try, hoặc
  • initialising const int từ giá trị được trả về bởi một hàm int mightThrowWrapper(int default = 0) rằng bản thân kết thúc tốt đẹp thử/bắt và trả về mặc định khi ném. Sau đó, bạn đã xử lý ngoại lệ được bản địa hóa const ness!
3

Đối với tôi điều này có vẻ như trường hợp cho hàm:

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

Tôi nghĩ bạn đã bỏ lỡ '()' ở cuối. –

+0

@ChristianRau: tốt điểm: Tôi tạo ra một đối tượng chức năng nhưng nó là cần thiết để cũng gọi nó. Tôi đã thêm chúng. Cảm ơn! –

Các vấn đề liên quan