c – noexcept和模板的可能g bug

c – noexcept和模板的可能g bug,第1张

概述当我将模板与noexcept说明符结合使用时,我收到有关不匹配的noexcept规范的错误.它汇编了我使用的各种版本的clang和所有版本的 gcc中的 fails. struct Y{ void h();};template<typename T>struct X{ void f() noexcept(noexcept(std::declval<Y>().h())); 当我将模板与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.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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1227463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存