- Co powinien robić zapis:
(int)(Typ*)1
Jak dla mnie to jest zrzutowanie wartości 1 na typ wskaźnikowy i zrzutowanie tego wskaźnika na int w celu osiągnięcia adresu, który i tak wychodzi 0x1.
Otóż pytam, bo natknąłem się w książce na klasę singleton
template<class T>
class Singleton
{
static T* ms_Singleton;
public:
Singleton()
{
assert( !ms_Singleton );
int offset = (int)(T*)1 - (int)(Singleton<T>*)(T*)1;
ms_Singleton = (T*)((int)this + offset);
}
~Singleton()
{
assert( ms_Singleton);
ms_Singleton = 0;
}
static T& GetSingleton()
{
assert( ms_Singleton );
return *ms_Singleton;
}
static T* GetSingletonPtr()
{
return ms_Singleton;
}
};
Tak więc chodzi mi o wyliczenie offsetu. W moim programie offset zawsze wychodzi 0, bo rzutowanie takie jak pokazałem wyżej daje mi cały czas wartość 1.
- Nie będę zakładał drugiego tematu. Ponieważ czytam standard C++11 chciałbym się dowiedzieć, czy te konstruktory są sobie równoznaczne?
struct C
{
std::string s;
//...
C( const C& x ) : s( x.s ) { }
C( C&& x ) : s(static_cast< std::string&& >( x.s )) { }
};
Jeżeli nie, to jaka jest między nimi różnica?