
//
// To jest przykładowy kod z podrozdziału 17.8 „Babranie się w typach — void* i rzutowanie” książki
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

//------------------------------------------------------------------------------
//void v;      // Błąd: nie ma obiektów typu void.
void f();    // Funkcja f() nie zwraca wartości — f() nie zwraca obiektu typu void.

//------------------------------------------------------------------------------

int main()
{
    void* pv1 = new int;        // Dobrze: int* konwertuje się na void*.
    void* pv2 = new double[10];  // Dobrze: double* konwertuje się na void*.
}

//------------------------------------------------------------------------------

void f(void* pv)
{
    void* pv2 = pv;   // Kopiowanie jest dozwolone (do tego właśnie służy typ void*).
    //double* pd = pv;  // Błąd: nie można przekonwertować void* na double*.
    //*pv = 7;          // Błąd: nie można wykonać dereferencji typu void*
                      // (nie wiadomo jakiego typu obiekt wskazuje).
    //pv[2] = 9;        // Błąd: nie mozna indeksować typu void*.
    int* pi = static_cast<int*>(pv);    // Dobrze: jawna konwersja.
                      // ...
}

//------------------------------------------------------------------------------

struct Register;
struct Buffer;

Register* in = reinterpret_cast<Register*>(0xff);

//------------------------------------------------------------------------------

void f(const Buffer* p)
{
    Buffer* b = const_cast<Buffer*>(p);
    // ...
}

//------------------------------------------------------------------------------
