c – noexcept和模板的可能g bug
发布时间:2020-12-16 07:10:41 所属栏目:百科 来源:网络整理
导读:当我将模板与noexcept说明符结合使用时,我收到有关不匹配的noexcept规范的错误.它汇编了我使用的各种版本的clang和所有版本的 gcc中的 fails. struct Y{ void h();};templatetypename Tstruct X{ void f() noexcept(noexcept(std::declvalY().h()));};templa
当我将模板与noexcept说明符结合使用时,我收到有关不匹配的noexcept规范的错误.它汇编了我使用的各种版本的clang和所有版本的
gcc中的
fails.
struct Y { void h(); }; template<typename T> struct X { void f() noexcept(noexcept(std::declval<Y>().h())); }; template<typename T> void X<T>::f() noexcept(noexcept(std::declval<Y>().h())) { } int main() { } 错误: g++ -std=c++1y -O2 -Wall -pthread main.cpp && ./a.out main.cpp:15:56: error: declaration of 'void X<T>::f() noexcept (noexcept (declval<Y>().Y::f()))' has a different exception specifier void X<T>::f() noexcept(noexcept(std::declval<Y>().f())) ^ main.cpp:11:10: error: from previous declaration 'void X<T>::f() noexcept (noexcept (declval<Y>().Y::f()))' void f() noexcept(noexcept(std::declval<Y>().f())); ^ 这是一个错误吗?有没有办法绕过它? 解决方法
使用枚举来存储noexcept运算符的结果是至少在目前由ideone使用的gcc-4.9.2中令人恐惧的
workaround.
#include <iostream> #include <utility> struct Y { void h() noexcept; void i(); }; enum Y_noexcept_value { h = noexcept(std::declval<Y>().h()),i = noexcept(std::declval<Y>().i()) }; template<typename T> struct X { void f() noexcept(Y_noexcept_value::h); void g() noexcept(Y_noexcept_value::i); }; template<typename T> void X<T>::f() noexcept(Y_noexcept_value::h) { } template<typename T> void X<T>::g() noexcept(Y_noexcept_value::i) { } int main() { std::cout << std::boolalpha << noexcept(std::declval<X<int>>().f()) << std::endl << noexcept(std::declval<X<int>>().g()) << std::endl; return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |