ใช่. ค่าในคอนเทนเนอร์ STL จำเป็นต้องรักษาความหมายของการคัดลอก IOW พวกเขาจำเป็นต้องทำงานเหมือนประเภทดั้งเดิม (เช่น int) ซึ่งหมายความว่าเหนือสิ่งอื่นใดพวกเขาควรเป็นค่าเริ่มต้นที่สร้างได้
หากไม่มีสิ่งนี้ (และข้อกำหนดอื่น ๆ ) การดำเนินการคัดลอก / ย้าย / สลับ / เปรียบเทียบภายในโครงสร้างข้อมูลที่ใช้คอนเทนเนอร์ STL จะเป็นเรื่องยากโดยไม่จำเป็น
เมื่ออ้างอิงถึงมาตรฐาน C ++ ฉันเห็นว่าคำตอบของฉันไม่ถูกต้อง ในความเป็นจริงแล้วโครงสร้างเริ่มต้นไม่ใช่ข้อกำหนด :
จาก 20.1.4.1:
ไม่จำเป็นต้องใช้ตัวสร้างเริ่มต้น ลายเซ็นฟังก์ชันสมาชิกคลาสคอนเทนเนอร์บางตัวระบุตัวสร้างเริ่มต้นเป็นอาร์กิวเมนต์เริ่มต้น T () ต้องเป็นนิพจน์ที่กำหนดไว้อย่างชัดเจน ...
ดังนั้นกล่าวอย่างชัดเจนประเภทค่าของคุณจะต้องเป็นค่าเริ่มต้นที่สามารถสร้างได้หากคุณบังเอิญใช้ฟังก์ชันของคอนเทนเนอร์ที่ใช้ตัวสร้างเริ่มต้นในลายเซ็น
ข้อกำหนดที่แท้จริง (23.1.3) จากค่าทั้งหมดที่จัดเก็บในคอนเทนเนอร์ STL คือCopyConstructible
และAssignable
และ
นอกจากนี้ยังมีข้อกำหนดเฉพาะอื่น ๆ สำหรับตู้คอนเทนเนอร์โดยเฉพาะเช่นการเป็นComparable
(เช่นกุญแจในแผนที่)
อนึ่งการคอมไพล์ต่อไปนี้โดยไม่มีข้อผิดพลาดบน comeau :
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
นี่อาจเป็นปัญหา g ++