std::unique_ptr<int, void(*)(int*)> ptr(&i, &A::release);
// ~~~~~~~~~~~~^
Таким образом, конструктор std::unique_ptr
будет ожидать указателя определенного c типа, который поможет компилятору разрешить неоднозначность.
Это:
decltype(&A::release(int*))
не является допустимым синтаксисом. Чтобы использовать decltype(e)
, вам нужно будет написать decltype(&A::release)
, но это снова вызовет ошибку двусмысленности, и поэтому он должен будет выглядеть следующим образом:
decltype(static_cast<void(*)(int*)>(&A::release))
, но это многословный способ сказать void(*)(int*)
.
Это:
std::function<void(int*)>
не помогает в разрешении двусмысленности, потому что конструктор std::functions
также является шаблоном, что означает компилятор снова пропускает контекст, который помог бы ему выбрать одну из перегруженных функций.