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' 例外がスローされます。

文字列をまったく解析できなかった場合を指します。

おそらく、ドキュメントはそれについてより明確になる可能性があります。

于 2013-08-09T11:51:28.183 に答える