このコードでは:
#include <vector>
#include <initializer_list>
template<typename T>
class some_custom_container : public std::vector<T>
{
public:
some_custom_container(const std::initializer_list<T>& contents)
{
for (auto& i : contents)
this->emplace_back(std::move(i));
}
};
class test_class
{};
int main()
{
test_class a;
some_custom_container<test_class> i = { a, test_class(), a };
}
私がそれを理解していれば、すべてのオブジェクト{ a, test_class(), a }
は安全に構築されています。名前付きオブジェクトがコピーされ、名前のないオブジェクトが移動されて、initializer_list が構築されます。その後、 thisinitializer_list
は参照によってsome_custom_container
のコンストラクターに渡されます。
次に、無駄な二重コピーを避けるために、それらすべてを移動してベクトルを埋めます。
このコンストラクタは安全ですか?たとえば、T が参照 & または && として評価された場合など、奇妙な状況では、ベクトルは常に十分に満たされている (安全なオブジェクトを含む) でしょうか?
この場合、initializer_list
stl コンテナーのコンストラクター実装がこのように実装されないのはなぜですか? 私が知っているように、それらのコンストラクターはコンテンツをコピーし、移動しません。