2014-09-03 16 views
5

Nó thực sự không rõ ràng với tôi tại sao bất cứ ai sẽ đặt tên một hình thức cụ thể của khởi tạo "giá trị khởi tạo". Nghe có vẻ như nó khởi tạo đối tượng bằng cách cho nó một giá trị ... nhưng đó là những gì khởi tạo nói chung, và tên không cho bạn biết bất cứ điều gì về mà giá trị nó sẽ sử dụng cho việc khởi tạo.Tại sao khởi tạo giá trị được đặt tên?

+0

Thuật ngữ này dường như được đề xuất lần đầu tiên trong [N1191] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1999/n1191.pdf). –

+5

Có lẽ thực tế là nó * thực hiện * luôn mang đến một giá trị hợp lý. Mặc định khởi tạo thường không. – chris

Trả lời

7

Các Boost value_init write-up cung cấp một lịch sử khá chi tiết về giá trị khởi nó đã kết thúc trong tiêu chuẩn từ defect report 178: More on value-initialization và nó có vẻ như thuật ngữ có nguồn gốc từ defect report 35: Definition of default-initialization. Mặc dù không ai trong số các tài liệu này thực sự cung cấp một nguồn gốc thích hợp cho thuật ngữ nó cung cấp một số ý tưởng tốt, nó nói:

Các Corrigendum đầu tiên kỹ thuật cho ++ chuẩn C (TC1), mà dự thảo đã được phát hành ra công chúng Tháng 11 năm 2001, giới thiệu Core Sự cố 178 (trong số nhiều vấn đề khác, tất nhiên).

Vấn đề đó đã giới thiệu khái niệm mới về khởi tạo giá trị (nó cũng cố định từ ngữ để không khởi tạo). Không chính thức, khởi tạo giá trị tương tự như khởi tạo mặc định với ngoại lệ trong một số trường hợp thành viên dữ liệu không tĩnh và lớp cơ sở các đối tượng con cũng được khởi tạo giá trị. Sự khác biệt là đối tượng được khởi tạo giá trị sẽ không có (hoặc ít nhất là ít hơn khả năng có) giá trị không xác định cho các thành viên dữ liệu và lớp cơ sở các đối tượng phụ; không giống như trường hợp của một đối tượng mặc định được xây dựng. (xem Vấn đề cốt lõi 178 cho mô tả chuẩn).

Để chỉ định khởi tạo giá trị của đối tượng, chúng tôi cần sử dụng bộ khởi tạo bộ trống:().

và khởi tạo giá trị ít có khả năng để lại một đối tượng có giá trị không xác định so với mặc định-initalization.

+0

OT, nhưng thay đổi này đã đưa ra một vấn đề khó chịu; cho một cấu trúc POD 'T foo = T();' và các câu lệnh tương tự như vậy chỉ được đảm bảo "làm việc" trong C++ 03, vì vậy trong mã di động bạn không thể làm điều đó mà không có rủi ro rằng nó sẽ được chạy trên một Trình biên dịch C++ 98 và âm thầm gây ra UB đáng sợ. –

+0

@MattMcNabb không may, có báo cáo lỗi cho điều đó không? –

+0

Không phải là tôi biết, đó chỉ là một điều mới được thêm vào trong TC1 –

Các vấn đề liên quan