我有一个继承自std容器的类。现在我有一个模板化的构造函数,它调用容器的基础构造函数。这个模板化构造函数适用于简单复制和移动构造函数,但不适用于initializer_list之一。 std :: initializer_list作为构造函数的模板参数
template<typename container_T>
class test : public container_T {
public:
using container_type = container_T;
test() {}
// templated constructor
template<typename T>
test(T t)
: container_T(t) {}
// without this it won't compile
test(std::initializer_list<typename container_T::value_type> l)
: container_T(l) {}
};
int main() {
test<std::deque<int>> vdi1;
test<std::deque<int>> vdi2({1,2,3,4,5,6,7,8,9});
std::cout << "vdi2 before:" << std::endl;
for(auto it : vdi2)
std::cout << it << std::endl;
test<std::deque<int>> vdi3(std::move(vdi2));
std::cout << "vdi2 before:" << std::endl;
for(auto it : vdi2)
std::cout << it << std::endl;
std::cout << "vdi3 before:" << std::endl;
for(auto it : vdi3)
std::cout << it << std::endl;
return 0;
}
如果我删除initializer_list
构造vdi2
将无法编译。我现在的问题是:为什么initializer_list不能由模板化的构造函数推导出来?有可能这样做吗?
其实,它不是一个复制或移动,他们是隐式声明的,除了你的构造函数。它不适用于'initializer_list's,因为它们不能被推导出来。 – dyp
为什么你不使用继承ctors? '使用container_T :: container_T;'[Live example](http://coliru.stacked-crooked.com/a/723b9da6b0f8766f) – dyp
@DyP为什么它应该复制或移动ctors? – user1810087