Ответ 1
Вы можете переопределить new
для класса, но ::new
всегда будет искать в глобальной области. То есть:.
class A {
void* operator new(std::size_t sz) {
/* 1 */ }
};
void* operator new(std::size_t sz) {
/* 2 */ }
void f() {
A* a1 = new A; // calls A::new (1)
A* a2 = ::new A; // calls implementation 2 or compiler new
}
Это описано в п. 5.3.4. Новое, раздел 9:
Если новое выражение начинается с унарного оператора
::
, имя функции распределения просматривается в глобальной области. В противном случае, если выделенным типом является тип классаT
или его массив, имя функции распределения отображается в областиT
. Если этот поиск не находит имя или если выделенный тип не является типом класса, имя функции распределения просматривается в глобальной области.
(начиная с проекта N3797)
То же самое относится к delete
и ::delete