GCC C++20模式下获取Boost float128最大值编译报错问题
编译错误原因分析
问题代码
#include <limits> #include <boost/multiprecision/float128.hpp> namespace bm = boost::multiprecision; int main() { auto const m = std::numeric_limits<bm::float128>::max(); }
编译命令及错误输出
hekto@ubuntu:~$ g++ -std=c++20 test.cpp In file included from test.cpp:2: /usr/include/boost/multiprecision/float128.hpp: In instantiation of ‘static std::numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::number_type std::numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::max() [with boost::multiprecision::expression_template_option ExpressionTemplates = boost::multiprecision::et_off; std::numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, ExpressionTemplates> >::number_type = boost::multiprecision::number<boost::multiprecision::backends::float128_backend, boost::multiprecision::et_off>]’: test.cpp:8:53: required from here /usr/include/boost/multiprecision/float128.hpp:728:55: error: could not convert ‘boost::multiprecision::quad_constants::quad_max’ from ‘const __float128’ to ‘std::numeric_limits<boost::multiprecision::number<boost::multiprecision::backends::float128_backend, boost::multiprecision::et_off> >::number_type’ {aka ‘boost::multiprecision::number<boost::multiprecision::backends::float128_backend, boost::multiprecision::et_off>’} 728 | static number_type (max)() BOOST_NOEXCEPT { return BOOST_MP_QUAD_MAX; } | ^~~~~~~~~~~~~~~~~ | | | const __float128
错误原因
这是Boost 1.71.0版本的float128组件在C++20标准下的兼容性问题:
- C++20之前,
boost::multiprecision::float128(本质是boost::multiprecision::number<float128_backend>)支持从原生__float128类型的隐式转换; - 但C20标准收紧了隐式转换规则,同时Boost 1.71.0的
float128_backend实现中,std::numeric_limits特化的max()方法直接返回__float128类型的常量BOOST_MP_QUAD_MAX,C20下不再允许这种隐式转换到boost::multiprecision::number<float128_backend>类型,导致编译失败; - 你的g++ 10.3.0对C++20标准的实现已经包含了这些转换规则的收紧,进一步触发了该问题。
环境信息:Xubuntu 20.04.4 LTS;g++ (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0;Boost版本1.71.0。
内容的提问来源于stack exchange,提问作者HEKTO
相关产品推荐
相关产品推荐

