часть языка, а не библиотечная функция?
Почему обычный new (без placement param) при этом компилируется, учитывая что это операция "сложнее" (i.e. помимо вызова конструктора надо еще и памяти откуда-то достать)?
скорее всего потому, что нужно ::operator new иметь
If placement_params are provided, they are passed to the allocation function as additional arguments. Such allocation functions are known as "placement new", after the standard allocation function void* operator new(std::size_t, void*), which simply returns its second argument unchanged https://en.cppreference.com/w/cpp/language/new скорее всего из-за этого, должно быть вызвано void* operator new ( std::size_t count, void* ptr ); //(9) https://en.cppreference.com/w/cpp/memory/new/operator_new заметьте, что The versions (1-4) are implicitly declared in each translation unit even if the <new> header is not included. Versions (1-8) are replaceable: a user-provided non-member function with the same signature defined anywhere in the program, in any source file, replaces the default version. Its declaration does not need to be visible. интуитивно подразумевается: версии (1)-(4) обычные функции для линкера, функции (5)-(8) обычные, но требуют определение тега std::nothrow, а версия (9) это специальная заглушечная библиотечная функция
Обсуждают сегодня