微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决非抛出函数指针可以指向抛出函数吗?

在关于 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 举报,一经查实,本站将立刻删除。