You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:54:27