Сообщение Re: Для чего нужна декларация operator new/delete в private от 30.10.2015 11:29
Изменено 30.10.2015 11:30 s.d.s
Для MSVC 2012
Без определения PN__ компилируется без ошибок.
С PN__
Для MSVC 2015 такой код: без PN__ — не линкуется, с PN__ — выдает такую же ошибку.
Если изменить Obj
то для MSVC 2015 получается такое же поведение как и для 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
Без определения PN__ компилируется без ошибок.
С PN__
Для MSVC 2015 такой код: без PN__ — не линкуется, с PN__ — выдает такую же ошибку.
Если изменить Obj
то для MSVC 2015 получается такое же поведение как и для 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.
Вопрос: а такое же оно в точности? (может я чего-то не учел)