在此代碼:
#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 }
所有對象都是安全構建的:在named-複製對象並移動未命名的對象以構造initializer_list。之後,initializer_list
通過引用some_custom_container
的構造函數傳遞。
然後,爲了避免無用的doble-copies,我將它們全部移動以填充矢量。
這個構造函數是否安全?我的意思是,在一個奇怪的情況下,例如,如果T被評估爲參考&或& &,是矢量總是充分填充(包含它的安全對象)?
如果是這種情況,爲什麼stl容器的構造函數實現沒有以這種方式實現?據我所知,他們的建設者複製並不會移動內容。
它甚至沒有編譯,因爲初始值設定項列表只提供對其內容的const訪問,並且不能從引用移動到const。另請參閱:http://stackoverflow.com/questions/8468774/can-i-list-initialize-a-vector-of-move-only-type –
這不會阻止它編譯,只能移動。複製構造函數將被調用。 – Puppy