use*_*108 5 c++ boost stl c++11
如果我将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;
}
Run Code Online (Sandbox Code Playgroud)
不,这不能保证.此断言可能会触发:
assert(&typeid(int) == &typeid(int));
Run Code Online (Sandbox Code Playgroud)
虽然需要一个非常愚蠢的编译器来解决这个问题,但它可能会发生.实际上,只有在动态库边界上比较typeid时,它才会失败:
assert(&typeid_of_int_in_lib1() == &typeid_of_int_in_lib2());
Run Code Online (Sandbox Code Playgroud)
这几乎肯定会触发.