C++,函数指针异常错误

qqq*_*qqq 5 c++ function-pointers exception language-lawyer c++17

我得到"错误:超出单个间接级别的异常规范",使用以下代码.请指出标准部分说不允许这样做.我想确保语言或编译器特定错误确实需要它.如果它来自语言规范,那么这条规则的动机是什么?我正在使用clang 3.8.0.

  int main()
    {
        void (**fp)() throw() ;
    }
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 6

你说:

请指出我的参考书/规范说不允许这样做.我想确保语言或编译器特定错误确实需要它.

void (**fp)() throw() ;
Run Code Online (Sandbox Code Playgroud)

您试图在指向函数指针的指针的声明中指定异常规范.标准不允许这样做.异常规范仅允许用于有限的声明集.

来自https://timsong-cpp.github.io/cppwp/n3337/except.spec#2(强调我的):

例外,规格,应仅在出现函数声明为函数类型,函数指针类型,参照功能类型,或成员函数指针类型,它是一个声明或定义,的顶级类型或上这样一种类型在函数声明符中作为参数或返回类型出现.异常规范不应出现在typedef声明或别名声明中.[ 例如:

 void f() throw(int);                    // OK
 void (*fp)() throw (int);               // OK
 void g(void pfa() throw(int));          // OK
 typedef int (*pf)() throw(int);         // ill-formed
Run Code Online (Sandbox Code Playgroud)

- 结束示例 ] 异常规范中表示的类型不应表示不完整类型.在一个表示为A型异常规范不得表示的指针或引用到一个不完整的类型,比其他void*,const void*,volatile void*,或const volatile void*.在异常规范中表示的类型cv T,"数组T"或"函数返回T"分别被调整为类型,"指向",或"指向函数返回的指针".TTT


您询问:

如果它来自语言规范,那么这条规则的动机是什么?

我没有答案.