В c ++ 14 это так же просто, как:
~MyAllocator() noexcept(noexcept(std::declval<allocator_type&>().deallocate( memory_, allocator_ ))) {
if (memory_ != nullptr) {
allocator_.deallocate(memory_, length_);
}
}
Живой пример .
Но в c++ 11 больно делать «правильно»:
~MyAllocator() noexcept(noexcept(std::declval<allocator_type&>().deallocate( std::declval<uint8_t*&>(), std::declval<std::size_t&>() ))) {
if (memory_ != nullptr) {
allocator_.deallocate(memory_, length_);
}
}
Живой пример .
Итак, обновитесь до c ++14 .
Вы также можете сделать это с радостью:
~MyAllocator() noexcept(noexcept(std::declval<allocator_type&>().deallocate( (uint8_t*)nullptr,1 ))) {
, но вы должны быть осторожны, потому что прохождение nullptr_t
может дать вам неправильный ответ (отсюда приведенный выше актерский составот nullptr
до uint8_t*
и избегая использования 0
в качестве литерала).