2016-06-15 41 views
14

Sách C++ Concurrency in Action bởi Anthony Williams nêu rõ trong 4.2.4 Lưu ngoại lệ cho trong tương lai mà có thể lưu trữ ngoại lệ trực tiếp mà không cần sử dụng std::copy_exception. Tuy nhiên tôi dường như không thể tìm thấy tiêu đề thư viện chuẩn, nơi mà std::copy_exception được xác định. Tôi có thể tìm thấy nó ở đâu?Đâu là std :: copy_exception được định nghĩa?

Trả lời

20

tl; dr: std::copy_exception được đổi tên thành std::make_exception_ptr trong <exception> cho tiêu chuẩn C++ 11 cuối cùng.


Ủy ban quyết định rằng tên copy_exception (có thể sao chép vào tiêu chuẩn từ boost::copy_exception) đã gây hiểu lầm vì những lý do sau đây.

Chức năng copy_exception trả về một exception_ptr để một bản sao của đối số của nó, như thể

template <class E> 
exception_ptr copy_exception(E e) { 
    try { 
     throw e; 
    } catch (...) { 
     return current_exception(); 
    } 
} 

Khi được gọi với một exception_ptr như là đối số, chức năng sẽ quay trở lại một exception_ptr trỏ đến một bản sao của exception_ptr cho là lập luận , thay vì trỏ đến điểm đối số exception_ptr. Vì tên copy_exception gây hiểu lầm cho trường hợp này, hàm đã được đổi tên thành std::make_exception_ptr cho tiêu chuẩn C++ 11 cuối cùng. Xem C++ Standard Library Defect Report 1130 để biết chi tiết và thảo luận về vấn đề này.

Chức năng std::make_exception_ptr được xác định trong <exception>.

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