enable_if 没有在构造函数中触发?

enable_if not triggering in the constructor?

我正在尝试实现非常基本的 shared_ptr(为简单起见跳过了大部分函数),对于这种情况,我们有一个基指针并创建一个派生指针,我创建了一个单独的构造函数。

template<typename T>
class shared_ptr {
public:
    shared_ptr(T* resource) :pointee_(resource),
        refCount_(new size_t(1))
    {
        std::cout << typeid(resource).name();
        deleter_ = [=]() {delete resource; };
    }

    template<typename U, std::enable_if_t<std::is_base_of_v<T, U>>>
    shared_ptr(U* resource) :pointee_(resource),
        refCount_(new size_t(1))
    {
        std::cout << typeid(resource).name();
        deleter_ = [=]() {delete resource; };
    }

    ~shared_ptr()
    {
        --(*refCount_);
        if (!(*refCount_)) {
            deleter_();
        }
    }
private:
    size_t* refCount_;
    T* pointee_;
    std::function<void()> deleter_;
};

class A { int a; };
class B :public A {};

int main() {
    shared_ptr<A> ptr(new B);
}

这里虽然is_base_of为1(我单独试过),但是enable_if没有触发,conductor也没有启用。而当我删除 enable if 时,重载解析起作用并且构造函数是 已启用。
谁能暗示我错过了什么?我不需要概念上的建议,只是提示我做错了什么或者我如何才能只为 class 层次结构启用此构造函数?

P.S。我知道我可以删除 enable_if,如果类型不可转换,编译器会警告我。

这个声明是错误的:

template<typename U, std::enable_if_t<std::is_base_of_v<T, U>>>

实例化时,enable_if_t 产生 void。这不是有效的非类型模板参数。尝试使用 int 代替:

template<typename U, std::enable_if_t<std::is_base_of_v<T, U>, int> = 0>

此外,请记住,即使您是通过模板参数来制作 sfinae,它们仍然是参数。通过在= 0中添加默认参数,调用函数时不需要填写