Iya. Nilai dalam penampung STL perlu mempertahankan semantik salinan. IOW, mereka perlu berperilaku seperti tipe primitif (misalnya int) yang berarti, antara lain, mereka harus dapat dibangun secara default.
Tanpa ini (dan persyaratan lainnya), akan sulit untuk mengimplementasikan berbagai operasi salin / pindahkan / tukar / bandingkan internal pada struktur data yang digunakan container STL.
Setelah mengacu pada Standar C ++, saya melihat jawaban saya tidak akurat. Konstruksi default, pada kenyataannya, bukanlah suatu persyaratan :
Dari 20.1.4.1:
Konstruktor default tidak diperlukan. Tanda tangan fungsi anggota kelas kontainer tertentu menentukan konstruktor default sebagai argumen default. T () harus merupakan ekspresi yang terdefinisi dengan baik ...
Jadi, tegasnya, jenis nilai Anda hanya perlu dapat dibangun secara default jika Anda kebetulan menggunakan fungsi penampung yang menggunakan konstruktor default dalam tanda tangannya.
Persyaratan sebenarnya (23.1.3) dari semua nilai yang disimpan dalam wadah STL adalah CopyConstructibledan Assignable.
Ada juga persyaratan khusus lainnya untuk wadah tertentu, seperti keberadaan Comparable(misalnya untuk kunci di peta).
Kebetulan, berikut ini mengkompilasi tanpa kesalahan pada hasil :
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
Jadi ini mungkin masalah g ++.