C++,函数指针异常错误
C++ , function pointer exception error
我使用以下代码得到 "error: exception specifications are not allowed beyond a single level of indirection"。请指出标准中不允许的部分。我想确定它确实是语言所必需的,或者只是编译器特定的错误。如果它来自语言规范,那么这条规则的动机是什么?我正在使用 clang 3.8.0.
int main()
{
void (**fp)() throw() ;
}
你说:
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.
与
void (**fp)() throw() ;
您正试图在指向函数指针的指针声明中指定异常规范。这是标准不允许的。 异常规范 仅允许用于一组有限的声明。
来自 https://timsong-cpp.github.io/cppwp/n3337/except.spec#2(强调我的):
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 cv T
, “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.
你问过:
If it is from language specification, what motivates this rule?
我没有答案。
我使用以下代码得到 "error: exception specifications are not allowed beyond a single level of indirection"。请指出标准中不允许的部分。我想确定它确实是语言所必需的,或者只是编译器特定的错误。如果它来自语言规范,那么这条规则的动机是什么?我正在使用 clang 3.8.0.
int main()
{
void (**fp)() throw() ;
}
你说:
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.
与
void (**fp)() throw() ;
您正试图在指向函数指针的指针声明中指定异常规范。这是标准不允许的。 异常规范 仅允许用于一组有限的声明。
来自 https://timsong-cpp.github.io/cppwp/n3337/except.spec#2(强调我的):
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*
, orconst volatile void*
. A type cvT
, “array ofT
”, or “function returningT
” denoted in an exception-specification is adjusted to typeT
, “pointer toT
”, or “pointer to function returningT
”, respectively.
你问过:
If it is from language specification, what motivates this rule?
我没有答案。