Вы действительно намереваетесь использовать значения указателя для сравнения "состояния"?Я согласен с @Drew, это интересная идея.Я не уверен, что стандарт гарантированно работает, хотя, если предположить, что это реализация только для заголовка.
Рассмотрим, что происходит, когда несколько объектов компиляции содержат одно и то же определение для Switch::ON
иSwitch::OFF
.Поскольку это переменные, а не функции, компоновщик должен будет произвольно выбирать между ними.
Когда вы запускали тест, что говорили популярные компиляторы: gcc 3, gcc 4, microsoft C ++ 2005, 2008 и 2010, и один из компиляторов Edison Design Groups, такой как http://www.comeaucomputing.com/?
Указанный тест будет состоять из:
// Switch.h
class Switch {
public:
static Switch const ON;
static Switch const OFF;
bool operator== (Switch const &s) const;
bool operator!= (Switch const &s) const;
private:
Switch () {}
Switch (Switch const &); // no implementation
Switch & operator= (Switch const &); // no implementation
};
Switch const Switch::ON;
Switch const Switch::OFF;
bool Switch::operator== (Switch const &s) const {
return this == &s;
}
bool Switch::operator!= (Switch const &s) const {
return this != &s;
}
и
// main.cpp
#include "Switch.h"
extern int another_test();
int main(int argc, char*argv[])
{
another_test();
const Switch& current_state = Switch::ON;
const Switch& another_state = Switch::OFF;
if (current_state == another_state) {
return 1;
} else if (current_state != another_state) {
return 2;
}
return another_test();
}
и
// another_test.cpp
#include "Switch.h"
int another_test()
{
const Switch& current_state = Switch::ON;
const Switch& another_state = Switch::OFF;
if (current_state == another_state) {
return 4;
} else if (current_state != another_state) {
return 5;
}
return 6;
}