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.outmain.cpp:15:56: error: declaration of 'voID X<T>::f() noexcept (noexcept (declval<Y>().Y::f()))' has a different exception specifIErvoID 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;}总结
以上是内存溢出为你收集整理的c – noexcept和模板的可能g bug全部内容,希望文章能够帮你解决c – noexcept和模板的可能g bug所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)