如何解决非抛出函数指针可以指向抛出函数吗?
在关于 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 举报,一经查实,本站将立刻删除。