Я ожидаю, что следующая программа вернет 0 все время. Однако с Visual Studio 2013 (обновление 4) программа выходит из 1 в сборках релизов. Я не уверен, является ли это ошибкой или оптимизатор компилятора корректен и полагается на поведение определенного края. Если макрос CONST выключен, exe exe возвращает 0. Если оптимизатор действительно прав, могу ли я получить причину, по которой он может испускать код, который он делает?
#if 1
#   define CONST const
#else
#   define CONST
#endif
class TypeId {
public:
    bool operator== (TypeId const & other) const
    {
        return id == other.id;
    }
private:
    TypeId (void const * id)
        : id(id)
    {}
public:
    template <typename T>
    static TypeId Get ()
    {
        static char CONST uniqueMemLoc = 0;
        return TypeId(&uniqueMemLoc);
    }
private:
    void const * id;
};
int main(int, char **)
{
    typedef int A;
    typedef unsigned int B;
    if (TypeId::Get<A>() == TypeId::Get<B>()) {
        return 1;
    }
    return 0;
}
