コンテナーの基礎となるコンストラクターを呼び出すテンプレート コンストラクターを持つ std コンテナーから継承するクラスを考えてみましょう。このテンプレート コンストラクターは、単純なコピーおよび移動コンストラクターでは機能しますが、initializer_list ctor では機能しません。
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 はテンプレート コンストラクターによって推定されないのですか? そして、そうすることが可能ですか?