Boost ICL では、間隔セットで cardinality() または size() 関数を呼び出すと、戻り値の型は間隔の型に関係なく size_t になります。32 ビット マシンでは、これは 32 ビットの符号なし整数です。ただし、間隔が int64_t 型の場合、カーディナリティは 32 ビット整数を簡単にオーバーフローさせる可能性があります。ここで明らかな何かが欠けていますか、それともこのライブラリの重大な欠陥ですか?
編集:例が追加されました
次のコードは、64 ビットではエラーなしでコンパイルおよび実行されますが、アサーションをスローする 32 ビット マシンではエラーが発生しません。
#include <boost/icl/interval_set.hpp>
int main()
{
boost::icl::interval_set<int64_t> is;
is.add(boost::icl::interval<int64_t>::closed(1, 4294967297LL));
assert(boost::icl::cardinality(is) == 4294967297LL);
}
編集: Ubuntu 13.10 で boost::icl バージョン 1.49.0 を使用しています
編集:
次のコードは 64 ビットでも動作しないため、これは特に 32/64 ビットの問題ではありません。
#include <boost/icl/interval_set.hpp>
int main()
{
boost::icl::interval_set<double> is;
is.add(boost::icl::interval<double>::closed(1, 1.5));
assert(boost::icl::cardinality(is) == 0.5);
}