C++ 使用自动类型推断时奇怪的boost cpp_Int行为
我刚刚注意到,在使用auto存储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 <
#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;