#include <gmpxx.h>
int main() {
mpq_class a("1/-2");
mpq_class b("1/-3");
mpq_class c = a + b;
printf("%s\n", c.get_str().c_str());
}
根据GMP手册,当无效表示字符串传递给构造函数时,应该引发异常。但是,在这种情况下,GMP不会。
此外,请尝试下面的代码,这会导致Segfault:
#include <gmpxx.h>
class Container {
public:
mpq_class rat;
Container(mpq_class _rat) : rat(_rat) {}
};
int main() {
mpq_class a("1/-3");
Container *c = new Container(a);
}
这是一个错误吗? GMP是众所周知的,我无法相信它很容易崩溃。
答案 0 :(得分:1)
您误解了手册,有关理性的C ++界面部分开始:
在以下所有构造函数中,如果给出一个分数,那么它应该是规范形式,或者如果没有,则调用`mpq_class :: canonicalize'。
这意味着如果你传入一个可以解析但不是规范形式的分数,那么你必须在其上调用canonicalize
。
如果字符串不是有效的理由,则抛出“std :: invalid_argument”异常。
指的是根本无法解析字符串的情况。
可以说,文件可以更明确。