Đúng. Giá trị trong vùng chứa STL cần duy trì ngữ nghĩa bản sao. IOW, chúng cần phải hoạt động giống như các kiểu nguyên thủy (ví dụ int), có nghĩa là, trong số những thứ khác, chúng phải có cấu trúc mặc định.
Nếu không có điều này (và các yêu cầu khác), sẽ rất khó thực hiện các thao tác sao chép / di chuyển / hoán đổi / so sánh nội bộ khác nhau trên các cấu trúc dữ liệu mà các vùng chứa STL được triển khai.
Khi tham chiếu đến Tiêu chuẩn C ++, tôi thấy câu trả lời của mình không chính xác. Trên thực tế, cấu trúc mặc định không phải là một yêu cầu :
Từ 20.1.4.1:
Hàm tạo mặc định không bắt buộc. Các chữ ký hàm thành viên lớp vùng chứa nhất định chỉ định hàm tạo mặc định làm đối số mặc định. T () phải là một biểu thức được xác định rõ ...
Vì vậy, nói một cách chính xác, kiểu giá trị của bạn chỉ cần được tạo mặc định nếu bạn tình cờ sử dụng một hàm của vùng chứa sử dụng hàm tạo mặc định trong chữ ký của nó.
Các yêu cầu thực (23.1.3) từ tất cả các giá trị được lưu trữ trong các vùng chứa STL là CopyConstructible
và Assignable
.
Ngoài ra còn có các yêu cầu cụ thể khác đối với các vùng chứa cụ thể, chẳng hạn như hiện hữu Comparable
(ví dụ: đối với các khóa trong bản đồ).
Ngẫu nhiên, các biên dịch sau không có lỗi trên Comeau :
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
Vì vậy, đây có thể là một vấn đề g ++.