boost::function::operator()のインライン化

gmane.comp.lib.boost.devel - 【function】 "paranoia" vs efficiency


Boost 1.40時点のboost::function::operator()には以下のようなチェックコードがありますが

if (this->empty())
    boost::throw_exception(bad_function_call());

これがあると(少なくてもMSVCでは)インライン化ができなくなってしまう、というお話。


BOOST_ASSERT(!empty())のほうがよさそうだけど互換性の理由から変更できない、
等々の議論があって結論としては、「function::emptyがtrueを返す場合、throwするだけの
単純なprivate関数を呼ぶようにすれば、安全性を犠牲にせずにこの分岐を省くことができる」
ということになったみたいです。