我花了一天的大部分时间来跟踪这个例子中的问题:
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>
int main ()
{
typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>> float_t;
//typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::expression_template_option::et_off> float_t; // <--- this works ok, too!
float_t dependency = 2.0;
auto const val = dependency / 2;
//float_t const val = dependency / 2; // <--- this works ok!
std::cout << val << std::endl;
dependency = val - 2;
std::cout << val << std::endl;
dependency = val - 2;
std::cout << val << std::endl;
dependency = val - 2;
return 0;
}
输出
1
-0.5
-1.25
似乎val对依赖项的依赖违反了 const 承诺。
将auto const更改为float_t const可以解决问题。
使用cpp_bin_float解决了这个问题
随机怀疑,禁用表达式模板可以解决问题
这发生在多个 VS 版本、mingw8.1 和 Coliru 上。
任何更熟悉内部运作的人可以解释发生了什么吗?