Evet. STL kapsayıcılarındaki değerler, kopyalama anlamlarını korumalıdır. IOW, ilkel türler (örneğin int) gibi davranmaları gerekir, bu da diğer şeylerin yanı sıra varsayılan olarak yapılandırılabilir olmaları gerektiği anlamına gelir.
Bu (ve diğer gereksinimler) olmadan, STL konteynerlerinin uygulandığı veri yapıları üzerinde çeşitli dahili kopyalama / taşıma / değiştirme / karşılaştırma işlemlerini uygulamak gereksiz bir şekilde zor olacaktır.
C ++ Standardına referansla, cevabımın doğru olmadığını görüyorum. Varsayılan yapım aslında bir gereklilik değildir :
20.1.4.1'den itibaren:
Varsayılan kurucu gerekli değildir. Belirli kapsayıcı sınıfı üye işlev imzaları, varsayılan kurucuyu varsayılan bağımsız değişken olarak belirtir. T () iyi tanımlanmış bir ifade olmalıdır ...
Bu nedenle, kesin olarak söylemek gerekirse, değer türünüzün yalnızca imzasında varsayılan kurucuyu kullanan bir konteyner işlevini kullanıyorsanız varsayılan olarak oluşturulabilir olması gerekir.
STL kaplarında depolanan tüm değerlerden gerçek gereksinimler (23.1.3) CopyConstructible
ve Assignable
.
Aynı zamanda, özel kaplar için başka özel gereksinimler de vardır, örneğin Comparable
(örneğin bir haritadaki anahtarlar için).
Bu arada, aşağıdaki hiçbir hata gelmeden derlenir :
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
Yani bu bir g ++ sorunu olabilir.