Boost多精度类型“float128”的最大值使我在C++20模式下使用GCC时出现编译错误

pprl5pva  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(231)

这个简单的代码不能用-std=c++20选项编译:

#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

为什么会这样呢?

  • 操作系统:Xubuntu 20.04.4 LTS
  • 编译器:g++(Ubuntu 10.3.0- 1ubuntu 1 ~20.04)10.3.0
  • 增压:1.71.0
yb3bgrhw

yb3bgrhw1#

documentation声明:
当用gcc编译时,你需要使用标志--std=gnu11/14/17,因为后缀'Q'是GNU的扩展名。如果使用标志--std=c11/14/17,编译就会失败,除非你也使用-fext-numeric-literal。
所以你需要指定--std=gnu++20而不是--std=c++20。boost文档不是最新的。The flag enables各种GNU extensions,其中之一是__float128
请参阅example on godbolt
编译器错误的根本原因是,如果没有--std=gnu++17--std=gnu++20标志,则_GLIBCXX_USE_FLOAT128未定义,这意味着BOOST_HAS_FLOAT128未定义,表示__float128无法识别为number_kind_floating_point这意味着boost::multiprecision::number不能从__float128隐式地构造,因为is_restricted_conversion<__float128, boost::multiprecision::float128_backend>::valuetrue,因为bm::detail::is_lossy_conversion<__float128, boost::multiprecision::float128_backend>::valuetrue,因为__float128number_kind_unknown而不是number_kind_floating_point
也就是说,如果没有gnu++20,就不支持boost::multiprecision::float128类型。

mrwjdhj3

mrwjdhj32#

直接来自the documentation
当使用gcc编译时,您需要使用--std=gnu++11/14/17标志,因为后缀Q是GNU扩展名。如果使用--std=c++11/14/17标志,编译将失败,除非您同时使用-fext-numeric-literals
这同样适用于c++20/gnu++20,只是该版本的文档尚未更新。

相关问题