Здесь есть два вопроса:
- Как найти
operator delete
, хотя это личное?
C ++ сначала пытается найти имя в любом месте ; проверка защиты доступа - более поздняя фаза.
Таким образом, ваш operator delete
найден, но недоступен.
- Почему мой
operator delete
должен быть доступен, когда конструктор noexcept
?
Формулировка «Если какая-либо часть инициализации объекта [...] завершается с помощью исключения», предполагает, что остальная часть абзаца неприменима из-за noexcept
.
Однако, как предполагает «любая часть ...», могут быть исключения между выделением и входом в конструктор (при оценке инициализаторов) или после выхода из конструктора (при уничтожении инициализаторов).
Рассмотрим
struct Y
{
Y() {}
Y(const Y&) { throw "sorry"; }
};
class X {
public:
X(Y y) noexcept { }
private:
static void operator delete(void*) { }
};
int main() {
Y y;
X* x = new X{y};
}
где конструктор копирования Y
выдает перед вводом конструктора X
, но после выделения, поэтому память должна быть освобождена.
Так что я думаю, что Visual C ++ не прав (снова).