非抛出函数指针可以指向抛出函数吗?

问题描述

在关于 noexcept 异常规范的 C++ Primer 上,据说指向一个函数的指针可能会隐式抛出(没有定义异常规范,例如:void(*p)();)或显式抛出(void(*p)() noexcept(false);)可以指向任何函数,甚至是非抛出函数

另一方面,一个可能不会抛出的函数指针(noexcept 例如 void(*p) noexcept;)只能指向一个不会抛出的函数

我发现这非常合乎逻辑,因为第一个指针可以从一个抛出函数指针指向一个非抛出函数,而第二个也是如此合乎逻辑。

我试过这个来了解更多:

void func1(){ // may throw
    std::cout << "func1()\n";
}

void func2() noexcept(false){ // may throw
    std::cout << "func2()\n";
}

void func3() noexcept(true){ // won't throw
    std::cout << "func3()\n";
}

void func4() noexcept{ // won't throw
    std::cout << "func4()\n";
}


int main(int argc,char* argv[]){

    void(*pFn1)();
    pFn1 = func1; // OK
    pFn1 = func2; // OK
    pFn1 = func3; // OK
    pFn1 = func4; // OK

    void(*pFn2)() noexcept(false);
    pFn2 = func1; // OK
    pFn2 = func2; // OK
    pFn2 = func3; // OK
    pFn2 = func4; // OK

    void(*pFn3)() noexcept(true);
    pFn3 = func1; // Error on C++ 17 and above. OK on C++11 and 14
    pFn3 = func2; // Error on C++ 17 and above. OK on C++11 and 14
    pFn3 = func3; // OK
    pFn3 = func4; // OK

    void(*pFn4)() noexcept(true);
    pFn4 = func1; // Error on C++ 17 and above. OK on C++11 and 14
    pFn4 = func2; // Error on C++ 17 and above. OK on C++11 and 14
    pFn4 = func3; // OK
    pFn4 = func4; // OK

    std::cout << '\n';
}
  • 当我针对 -std=c++17-std=c++2a 编译程序时,它会正常工作,因此我收到了行注释中所写的错误。但是当我针对 -std=c++11-std=c++14 进行编译时,我让它们全部工作并且编译器没有抱怨?!

这是否意味着标准发生了变化?谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...