2011-09-07 25 views
8

Trong C++ 0x -n3290 Mớn nước: họ thêm vào trong phần: Destructors: 12,4 điểm/2 dòng cuối cùngMột destructor Shall OR sẽ không được khai báo với một con trỏ? trong C++

  **A destructor shall not be declared with a ref-qualifier.** 

Trong C++ 03 Dự thảo .... họ không đề cập đến thời điểm này trong destructors?

câu hỏi của tôi là liệu

*~S() ; //this declaration is allowed or not according to the Standard's 
    //**~S(); ***~S() ; etc........... 

kiểu này khai được phép? Không có nơi nào trong Dự thảo ông mô tả về điều này ... Tuyên bố?

Trong GCC 4.6.0, Sun/Oracle C++ 12.0, ---> tuyên bố này được phép int Comeau C/C++ -> không được phép

Trả lời

7

Bạn đã hiểu sai những gì sàng lọc lại có nghĩa là trong tiêu chuẩn mới. Tương tự như vậy, bạn có thể cung cấp một vòng loại const cho bất kỳ hàm thành viên nào trong C++ 03, bạn cũng có thể thêm vòng loại vào hàm thành viên trong C++ 0x. sửa đổi sẽ ảnh hưởng đến các loại của this tranh luận ngầm với chức năng:

struct test { 
    void f() const &&; // implicit "this" in "f" is of type "test const &&" 
}; 

Trong cùng một cách mà một destructor không thể static, hoặc const, hoặc const volatile trong C++ 03, nó không thể lấy một ref -qualifier (& hoặc &&) trong C++ 0x. Tất nhiên bit này không có trong tiêu chuẩn cũ.

+0

@ DAvid: oh ... nhưng xét về tuyên bố hủy diệt .. họ chỉ nói abut ~ operator .. nhưng không có nơi họ nói về ... tuyên bố như vậy được cho phép , không được phép vv ... như * ~ A(), & ~ A(), v.v. – user751747

+2

@ user751747: Ngữ pháp nói rằng * vòng loại * được thêm vào các hàm ở bên phải (sau dấu * cv-qualifiers *), và điều đó có nghĩa là câu nói đến: '~ A() &;' hoặc '~ A() &&;', và định nghĩa cả hai câu đó là không hợp lệ. '&~A();' và '* ~ A(); 'không hợp lệ vì chúng không khớp với ngữ pháp * *, không cần phải cung cấp mô tả bổ sung về mọi thứ không được biên dịch. Ví dụ, không có nơi nào trong tiêu chuẩn nó nói rằng 'a] [+ =/a' là không chính xác, nó chỉ cho biết cấu trúc nào là chính xác và cái nào không khớp với bất kỳ cái nào trong số chúng. –

+0

@ david: cảm ơn bạn – user751747

10

Đó không giống như nó sẽ bao giờ là một tuyên bố chức năng pháp lý dưới bất kỳ hình thức nào, ít hơn nhiều đối với một destructor. Tôi không tích cực phần nào của tiêu chuẩn đang nói đến, nhưng tôi đoán.

Tôi nghi ngờ có một vòng loại nói rằng hàm của bạn đang được gọi trên tham chiếu rvalue. Một cái gì đó như thế này:

class A { 
public: 
    void IAmAnRValue() &&; 
}; 

Tôi nghĩ rằng ngôn ngữ trong tiêu chuẩn được nói rằng vòng loại này không được phép trên một destructor, giống như có một trailing const cũng sẽ là bất hợp pháp.

Và, khi tiếp tục điều tra, sự chắc chắn về tính chính xác của phỏng đoán của tôi tăng đáng kể. Đây là sự biện minh:

Ở đó, nó nêu rõ rằng các chức năng hiện có thể có 'bộ định tính lại' sau 'cv-qualifer'. Điều này có nghĩa là một tuyên bố chức năng có thể được theo sau bởi const & hoặc const volatile && thay vì chỉ const. Và thuật ngữ được sử dụng (ref-qualifier) ​​là giống như thuật ngữ được sử dụng trong ít tiêu chuẩn bạn đang trích dẫn. Và nó có ý nghĩa cho những người hủy diệt không thể có được.

+0

@ Omni: cảm ơn câu trả lời của bạn – user751747

1

Quy tắc mà bạn đang tìm kiếm được nêu trong đoạn tương tự, 12.4p2

Destructor mất không tham số, và không có kiểu trả về có thể được chỉ định cho nó (thậm chí không void).

Cụm từ "không có kiểu trả về có thể được chỉ định cho nó" cũng cấm "*", mà không phải là ngay lập tức rõ ràng nhưng có thể được nhìn thấy bằng cách so sánh với 12.3.2p1 (so sánh với this issue report):

... Các chức năng này được gọi là chức năng chuyển đổi. Không thể chỉ định loại trả về.

Quy tắc đó là điều khiến việc triển khai cấm * operator int() { }. Bạn cũng có thể tranh luận với 12.4p1, mặc dù như được diễn đạt rất chung chung và là tuyên bố đầu tiên trong phần phá hủy, tôi cho rằng câu lệnh khác ở trên phải là đối số chính

Cú pháp khai báo đặc biệt sử dụng hàm tùy chọn- specifier (7.1.2) tiếp theo là ˜ theo sau là tên lớp của destructor theo sau là một danh sách tham số rỗng được sử dụng để khai báo destructor trong định nghĩa lớp.

Như có thể thấy/đọc, không có đề cập đến người kê khai như * trong mô tả đó, thể hiện mục đích của tác giả.

+0

cảm ơn câu trả lời của bạn – user751747

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