C++ 使用自动类型推断时奇怪的boost cpp_Int行为

C++ 使用自动类型推断时奇怪的boost cpp_Int行为,c++,c++11,boost,C++,C++11,Boost,我刚刚注意到,在使用auto存储boost cpp_int操作的结果时,出现了一些非常奇怪的行为 #include <boost/multiprecision/cpp_int.hpp> int main() { using boost::multiprecision::cpp_int; cpp_int a = 1, b = 10 * a, d; auto c = 10 * a; d = c; std::cout << b <

我刚刚注意到,在使用auto存储boost cpp_int操作的结果时,出现了一些非常奇怪的行为

#include <boost/multiprecision/cpp_int.hpp>

int main() {
    using boost::multiprecision::cpp_int;
    cpp_int a = 1, b = 10 * a, d;
    auto c = 10 * a;
    d = c;
    std::cout << b << " " << c << " " << d << "\n";
}
而不是:

10 10 10
有人能解释这一点吗?

问题在于,为了避免计算中间结果(链接的Boost页面有一节解释了这样做的原因)

因此,以下表达式中的
c
类型不是
cpp_int

auto c = 10 * a;  // c is some internal implementation defined type
您可以通过以下方式确认这一点

除非您完全确定
a
b
c
的寿命将超过
my_表达式的寿命

在本例中,其中一个操作数是文字,这似乎会影响将表达式模板转换为
cpp_int
的结果,即使
c
的生存期与
a
的生存期匹配。如果不深入研究
操作符*
的实现,很难说到底发生了什么,但可以说,您正在做一些不应该做的事情,而且您的示例很可能有未定义的行为

您可以通过多种方式解决此问题,首先使用
cpp_int
而不是
auto
。或者将表达式模板的结果强制转换为
cpp\u int

auto c = cpp_int(10 * a);
或者将
10
存储在
cpp_int
中;然后,Boost文档中提到的警告将适用,您的示例将产生预期的结果

cpp_int a = 1, b = 10 * a, d, e = 10;
auto c = e * a;

无法复制。谢谢,回答得很好。除了最重要的部分,我已经知道了一切,操作数的生存期必须超过返回表达式的生存期。返回的垃圾现在有意义了。
 auto my_expression = a + b - c;
auto c = cpp_int(10 * a);
cpp_int a = 1, b = 10 * a, d, e = 10;
auto c = e * a;