Tiêu chuẩn rõ ràng cấm đặc tả ngoại lệ xuất hiện trong một tuyên bố typedef
hoặc bí danh. Nhưng nó cũng nói rằng trình định danh ngoại lệ có thể xuất hiện trong một kiểu con trỏ hàm.
§15.4/2[except.spec]
An exception-specification shall appear only on a function declarator for a function type, pointer to function type, reference to function type, or pointer to member function type that is the top-level type of a declaration or definition, or on such a type appearing as a parameter or return type in a function declarator. An exception-specification shall not appear in a typedef
declaration or alias-declaration.
Và nếu một con trỏ đến chức năng không có một đặc điểm kỹ thuật ngoại lệ, sau đó con trỏ hàm phải lúc nào cũng được chỉ định một loại chức năng mà có một đặc tả ngoại lệ tương thích.
§15.4/5
...
A similar restriction applies to assignment to and initialization of pointers to functions, pointers to member functions, and references to functions: the target entity shall allow at least the exceptions allowed by the source value in the assignment or initialization. ...
Sử dụng hai này, bạn có thể nhận được các đặc điểm kỹ thuật noexcept
vào kiểu con trỏ hàm trong một thời trang vòng xoay.
void (*foo_ptr)(void *) noexcept = nullptr;
using function_type = decltype(foo_ptr);
Bây giờ, bạn không thể chỉ định hàm không có thông số noexcept(true)
cho con trỏ chức năng loại function_type
. clang will fail to compile mã với lỗi
error: target exception specification is not superset of source
g ++ biên dịch tốt. Có lẽ nó chỉ bỏ qua các specifier ... – DarioP
GCC không phải là tiêu chuẩn tuân thủ ở đây. Clang là chính xác. – Columbo
Hm, đó là một lỗi gcc lạ. Ut không chấp nhận typedef nhưng chấp nhận 'using'. –