Информация об изменениях

Сообщение Re: Для чего нужна декларация operator new/delete в private от 30.10.2015 11:29

Изменено 30.10.2015 11:30 s.d.s

Для MSVC 2012

class Obj {
...
private:
    friend class MyClass;
    void* operator new(size_t, void*);
    void operator delete(void*, Obj_tag);
};

class MyClass {
...
};

#defined PN__

int main() {
#ifdef PN__
    char buf[1024] = { 0 };
    Obj * o1 = reinterpret_cast<Obj*>(buf);
    new (o1) Obj;
#endif
    MyClass o2;
}


Без определения PN__ компилируется без ошибок.
С PN__
error C2248: 'Obj::operator new': cannot access private member declared in class 'Obj'



Для MSVC 2015 такой код: без PN__ — не линкуется, с PN__ — выдает такую же ошибку.

Если изменить Obj

class Obj {
...
private:
    enum class Obj_tag : size_t {};
    friend class MyClass;
    void* operator new(size_t, void*);
    void operator delete(void*, Obj_tag);
};


то для MSVC 2015 получается такое же поведение как и для MSVC 2012.


Вопрос: а такое же оно в точности? ()
Re: Для чего нужна декларация operator new/delete в private
Для MSVC 2012

class Obj {
...
private:
    friend class MyClass;
    void* operator new(size_t, void*);
    void operator delete(void*, Obj_tag);
};

class MyClass {
...
};

#defined PN__

int main() {
#ifdef PN__
    char buf[1024] = { 0 };
    Obj * o1 = reinterpret_cast<Obj*>(buf);
    new (o1) Obj;
#endif
    MyClass o2;
}


Без определения PN__ компилируется без ошибок.
С PN__
error C2248: 'Obj::operator new': cannot access private member declared in class 'Obj'



Для MSVC 2015 такой код: без PN__ — не линкуется, с PN__ — выдает такую же ошибку.

Если изменить Obj

class Obj {
...
private:
    enum class Obj_tag : size_t {};
    friend class MyClass;
    void* operator new(size_t, void*);
    void operator delete(void*, Obj_tag);
};


то для MSVC 2015 получается такое же поведение как и для MSVC 2012.


Вопрос: а такое же оно в точности? (может я чего-то не учел)