2017-06-05 23 views
5

Tôi nhận được "lỗi: thông số kỹ thuật ngoại lệ không được phép vượt quá một cấp độ gián tiếp" với mã sau. Xin vui lòng chỉ cho tôi một cuốn sách tham khảo/spec nói rằng nó không được phép. Tôi muốn chắc chắn rằng nó thực sự được yêu cầu bởi ngôn ngữ hoặc chỉ lỗi trình biên dịch cụ thể. Nếu nó là từ đặc tả ngôn ngữ, điều gì thúc đẩy quy tắc này? Tôi đang sử dụng clang 3.8.0.C++, lỗi ngoại lệ con trỏ chức năng

int main() 
    { 
     void (**fp)() throw() ; 
    } 
+0

"Vui lòng chỉ cho tôi một cuốn sách tham khảo/thông số nói rằng nó không được phép." - Tiêu chuẩn? –

+0

@EdgarRokyan Tôi nên sử dụng "tiêu chuẩn" thay cho "spec". Bất kỳ ai, vui lòng chỉnh sửa câu hỏi. – qqqqq

Trả lời

6

Bạn nói:

Please point me to a reference book /spec that says that it is not allowed. I want to be sure that it is really required by the language or just compiler specific error.

Với

void (**fp)() throw() ; 

bạn đang cố gắng để xác định một ngoại lệ đặc điểm kỹ thuật trong việc kê khai của một con trỏ đến một con trỏ hàm. Điều đó không được phép theo tiêu chuẩn. Đặc điểm ngoại lệ chỉ được phép cho một tập hợp giới hạn các khai báo.

Từ https://timsong-cpp.github.io/cppwp/n3337/except.spec#2 (tôi nhấn mạnh):

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. [ Example:

void f() throw(int);     // OK 
void (*fp)() throw (int);    // OK 
void g(void pfa() throw(int));   // OK 
typedef int (*pf)() throw(int);   // ill-formed 

end example ] A type denoted in an exception-specification shall not denote an incomplete type. A type denoted in an exception-specification shall not denote a pointer or reference to an incomplete type, other than void* , const void* , volatile void* , or const volatile void* . A type cvT , “array of T ”, or “function returning T ” denoted in an exception-specification is adjusted to type T , “pointer to T ”, or “pointer to function returning T ”, respectively.


Bạn hỏi:

If it is from language specification, what motivates this rule?

Tôi không có một câu trả lời cho điều đó.

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