5

重複の可能性:
typeid が同じ型に対して異なる type_info インスタンスを返すのはいつですか?

operand->type() == typeid(ValueType)以下の行を に変更する&operand->type() == &typeid(ValueType)と、コードは引き続き gcc で動作し、実行可能ファイルで占有するスペースが少なくなります (そして、何年も前からそうなっています)。ただし、C++11 標準は、この最適化が全体で機能することを保証しますか?異なるコンパイラ?

template<typename ValueType>
ValueType * any_cast(any * operand)
{
    return operand && 
#ifdef BOOST_AUX_ANY_TYPE_ID_NAME
        std::strcmp(operand->type().name(), typeid(ValueType).name()) == 0
#else
        operand->type() == typeid(ValueType)
#endif
        ? &static_cast<any::holder<ValueType> *>(operand->content)->held
        : 0;
}
4

1 に答える 1

5

いいえ、保証されていません。このアサートは以下をトリガーする可能性があります。

assert(&typeid(int) == &typeid(int));

その火を作るにはかなり愚かなコンパイラが必要ですが、それは起こる可能性があります。実際には、typeidがダイナミックライブラリの境界を越えて比較されている場合にのみ失敗します。

assert(&typeid_of_int_in_lib1() == &typeid_of_int_in_lib2());

これはほぼ確実にトリガーされます。

于 2012-04-12T07:09:03.600 に答える