【问题标题】:C++ , function pointer exception errorC++,函数指针异常错误
【发布时间】:2017-06-05 20:43:49
【问题描述】:

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

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

【问题讨论】:

  • “请指点我参考书 /spec 上说这是不允许的。” - 标准?
  • @EdgarRokyan 我应该用“标准”代替“规格”。任何人,请随时编辑问题。

标签: c++ exception language-lawyer function-pointers c++17


【解决方案1】:

你说:

请指点我参考书 /spec 说它是不允许的。我想确定它确实是语言所需要的,或者只是编译器特定的错误。

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

您正试图在指向函数指针的指针的声明中指定一个异常规范。这是标准不允许的。 Exception-specification 只允许用于一组有限的声明。

来自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

end example ] exception-specification 中表示的类型不应表示不完整的类型。除了void*const void*volatile void*const volatile void* 之外,exception-specification 中表示的类型不应表示指向不完整类型的指针或引用。在 exception-specification 中表示的类型 cv T、“T 数组”或“返回 T 的函数”被调整为类型 T 、“指向T的指针”或“指向返回T的函数的指针”。


你问:

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

我没有答案。

【讨论】:

    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2015-06-16
    • 2013-03-15
    • 2020-04-29
    • 2017-10-28
    相关资源
    最近更新 更多