2016-12-22 27 views
15

Trong C++ 17 noexcepthas been added to the type system:std :: chức năng với noexcept trong C++ 17

void r1(void (*f)() noexcept) { f(); } 
void foo() { throw 1; } 

int main() 
{ 
    r1(foo); 
} 

Các phiên bản mới nhất của gcc và Clang trong C++ 17 chế độ từ chối cuộc gọi r1(foo)void (*)() không thể chuyển đổi hoàn toàn thành void (*)() noexcept.

Nhưng với std::function thay vì:

#include <functional> 

void r2(std::function<void() noexcept> f) { f(); } 
void foo() { throw 1; } 

int main() 
{ 
    r2(foo); 
} 

kêu vang chấp nhận chương trình, dường như bỏ qua noexcept specifier; và g ++ đưa ra một lỗi lạ về std::function<void() noexcept>.

Hành vi chính xác cho chương trình thứ hai này trong C++ 17 là gì? định nghĩa

+0

Nếu 'noexcept' bây giờ được coi là một phần của loại, thì' void() noexcept' khác với 'void()', do đó điều này là không đúng định dạng. Không bao gồm đặc tả ngoại lệ như là một phần của chữ ký của hàm, không giống Java, là thứ mà tôi luôn nghĩ C++ đã sai. Tốt để thấy rằng điều này hiện đang được sửa chữa. –

+3

Hành vi là nó nên khiếu nại về một loại không đầy đủ. 'std :: function' chỉ là một phần dành riêng cho' R (Args ...) ', không phải là' R (Args ...) noexcept'. –

+0

@ T.C. ok, hành vi chính xác của g ++ 7 sau đó. Bạn có thể viết bình luận đó vào câu trả lời không? –

Trả lời

11

std::function 's đã không thay đổi trong bản dự thảo làm việc hiện tại:

template<class T> 
class function; // not defined 

template<class R, class... ArgTypes> 
class function<R(ArgTypes...)> { 
    /* ... */ 
}; 

Kể từ void() noexcept không phù hợp với chuyên môn hóa một phần, std::function<void() noexcept> là một loại không đầy đủ. Cả hai Clang và GCC trunk chẩn đoán điều này cho phù hợp.

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