2016-07-27 14 views
18

Tôi chưa bao giờ thấy [[ noreturn ]] được sử dụng trên các chức năng trả về không có khoảng trống trước đó.Tôi có thể sử dụng [[noreturn]] trên các chức năng trả về không rỗng không?

Được định nghĩa sau đây?

[[ noreturn ]] int function(); 

int function(){ 
    while(true){/* impl */} 
    return 0; 
} 

Lý do loại trả về phải là int, là do hàm được chuyển đến hàm khác thông qua con trỏ hàm.

Vì vậy, giả sử người gọi trông giống như sau:

//call the non-returning function 
int var = (*fptr)(); 

//use var some way (even though the function will never actually return) 
std::cout << var; 

sẽ triển lãm này bất kỳ loại hành vi không xác định?

+3

Bạn có thể gặp phải sự cố về triển khai với phụ cấp thực hiện để giả định rằng vòng lặp vô hạn kết thúc. ([link] (http://blog.regehr.org/archives/161)) – chris

+0

@chris Tôi cũng hy vọng gắn thẻ giá trị trả lại với [[might_unused]]. –

+4

Từ liên kết bạn đã đăng: * Hành vi không xác định nếu hàm có thuộc tính này thực sự trả về. * – 101010

Trả lời

23

Đặc điểm kỹ thuật tiêu chuẩn trên [[noreturn]] nằm trong [dcl.attr.noreturn]. Toàn bộ văn bản quy phạm lần đọc:

các thuộc tính thẻnoreturn xác định rằng một hàm không trả lại. Nó sẽ xuất hiện nhiều nhất một lần trong mỗi thuộc tính-danh sách và không có thuộc tính-đối số-khoản sẽ có mặt. Thuộc tính có thể được áp dụng cho mã khai báo trong khai báo hàm. Khai báo đầu tiên của hàm sẽ chỉ định thuộc tính noreturn nếu bất kỳ khai báo nào của hàm đó chỉ định thuộc tính noreturn. Nếu hàm được khai báo với thuộc tính thuộc tính noreturn trong một đơn vị dịch và cùng một hàm được khai báo mà không có thuộc tính noreturn trong một đơn vị dịch khác, chương trình không đúng định dạng; không cần chẩn đoán.

Nếu hàm f được gọi là trong đó f trước đây được khai báo với thuộc tính noreturnf cuối cùng trả về, hành vi không xác định.

Không có đề cập đến trả lại loại. Điều duy nhất quan trọng là hàm không trả về. Nếu hàm trả về (cho dù void hoặc int hoặc vector<vector<double>>), thì hành vi sẽ không được xác định. Nếu hàm không trả về, kiểu trả về là không quan trọng.

10

Từ chuẩn C++ §7.6.8/p2 Noreturn thuộc tính [dcl.attr.noreturn] (Nhấn mạnh Mine):

Nếu một hàm f được gọi trong đó f được khai báo trước với thuộc tính noreturn và f cuối cùng, hành vi là không xác định. [Lưu ý: Chức năng có thể chấm dứt bằng cách ném một ngoại lệ . - lưu ý cuối cùng] [Lưu ý: Việc triển khai được khuyến khích để đưa ra cảnh báo nếu chức năng được đánh dấu [[noreturn]] có thể trở lại. - kết thúc lưu ý]

Vì chức năng của bạn sẽ không bao giờ đạt đến return 0; không có UB.

+5

Làm cách nào để trả lời câu hỏi? OP biết nó không nên quay trở lại, anh ta hỏi về loại hình của nó. –

+0

Trích dẫn tiêu chuẩn làm rõ rằng nó * là * ub như thế nào? Chức năng của OP không quay trở lại. – Barry

+0

@Barry không trả về '0'? – 101010

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