В зависимости от стандартной реализации C ++, std::allocator<T>::allocate
можно определить как:
T* allocate(size_t n, const void* hint = 0);
T* allocate(size_t n);
T* allocate(size_t n, const void* hint); // deprecating usage of hint
T* allocate(size_t n);
То есть второй реализация превращает allocate
в перегруженную функцию-член. И этот в настоящее время используется в стандартной библиотеке MSV C. :
_NODISCARD __declspec(allocator) _Ty* allocate(_CRT_GUARDOVERFLOW const size_t _Count) {
return static_cast<_Ty*>(_Allocate<_New_alignof<_Ty>>(_Get_size_of_n<sizeof(_Ty)>(_Count)));
}
_CXX17_DEPRECATE_OLD_ALLOCATOR_MEMBERS _NODISCARD __declspec(allocator) _Ty* allocate(
_CRT_GUARDOVERFLOW const size_t _Count, const void*) {
return allocate(_Count);
}
Такая реализация делает &T::allocate
неоднозначным и поэтому отклоняется при замене.