如何转发std :: initializer_list <T>?

KoK*_*oru 7 c++ initializer-list c++11

我试图转发std::initializer_list但是

no known conversion from 'std::initializer_list<A>' to 'std::initializer_list<B>'
Run Code Online (Sandbox Code Playgroud)

这是测试代码

#include <iostream>

class B {
};

class A: public B {
};

class not_working {
    private:
    void fun(std::initializer_list<B> p) {
    }
    public:
    template<typename T>
    not_working(std::initializer_list<T> args) {
        fun(args);
    }
};

class working {
    private:
    void fun(std::initializer_list<B> p) {
    }
    public:
    working(std::initializer_list<B> args) {
        fun(args);
    }
};

int main(){    
    working{A{}, A{}};
    //not_working{A{}, A{}};
}
Run Code Online (Sandbox Code Playgroud)

如何在std::initializer_list
没有明确演员的情况下转发not_working{(B)A{}, (B)A{}};

为什么这对我来说是个问题?

我有一个代理类,它将构造函数参数转发给一个类.像这样的东西:

 template<typename T>
 class proxy {
    T real;
    template<typename S> proxy(std::initializer_list<S> p): real(p) {}
    template<typename S...> proxy(S ... p): real(p ...) {}
};
Run Code Online (Sandbox Code Playgroud)

Jar*_*ubb 3

std::vector<A>你不能,原因与你不能将 a 转换为 a的原因相同std::vector<B>。不同类型的容器是完全不相关的。

“更改”容器类型的唯一方法是构造新类型的新容器(例如,std::vector<B>(a.begin(), a.end())但要注意切片!)。