0
#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 是如此知名,以至于我无法相信它会如此轻易地崩溃。

4

1 回答 1

1

您误解了手册,关于理性的 C++ 接口部分开始:

在以下所有构造函数中,如果给出了分数,那么它应该是规范形式,或者如果没有,则调用 `mpq_class::canonicalize'。

这意味着如果您传入一个可以解析但不是规范形式的分数,那么必须调用canonicalize它。

如果字符串不是有效的有理数,则抛出“std::invalid_argument”异常。

refers to the case that the string could not be parsed at all.

Arguably, the documentation could be clearer on that.

于 2013-08-09T11:51:28.183 回答