这个问题已经在这里有了答案:




9年前关闭。






如果我将下面的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;
}

最佳答案

不,不能保证。此断言可能触发:

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

尽管这将需要一个非常愚蠢的编译器来解决,但还是有可能发生。实际上,只有跨动态库边界比较typeid时,它才会失败:
assert(&typeid_of_int_in_lib1() == &typeid_of_int_in_lib2());

这几乎肯定会触发。

关于c++ - boost::C++ 11的任何typeid优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10118558/

10-12 20:33