问题描述
在关于 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 (将#修改为@)