Я ожидаю, что следующая программа вернет 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;
}