2015-09-25 20 views
21

Những gì tôi làm để có nghĩa là có thể được giải thích bằng ví dụ sau:Có std :: make_shared thực hiện khởi tạo giá trị (GCC và clang không đồng ý)?

auto p = std::make_shared<int>();

int biến mặc định khởi tạo (do đó đã có giá trị rác) hoặc giá trị khởi tạo (do đó có giá trị bằng không)? Tôi đã thử nghiệm trên GCC 5.2 và clang 3.6 với khởi tạo giá trị trước đây và sau đó làm khởi tạo mặc định. Tôi tự hỏi tiêu chuẩn nói gì về điều này? Theo tôi, C++ hiện đại chắc chắn nên thực hiện khởi tạo giá trị trong trường hợp này.

+0

_ "Tôi đã thử nghiệm trên GCC 5.2 và clang 3.6 với khởi tạo giá trị trước đây và sau đó thực hiện khởi tạo mặc định."_ Tôi ngạc nhiên bởi kết quả của bạn cho tiếng kêu, làm thế nào bạn kiểm tra nó? –

+0

@ Jonathanathanely Tôi đã thử nghiệm nó trên trình biên dịch trực tuyến nhúng trong cppref – Lingxi

+1

Nhưng làm thế nào? Bạn đã viết mã nào để xác minh hành vi? –

Trả lời

22

Có.

N3797 20.8.2.2.6 nhớ

Phân bổ thích hợp cho một đối tượng kiểu T và xây dựng một đối tượng trong bộ nhớ thông qua vị trí biểu hiện mới ::new (pv) T(std::forward<Args>(args)...)

Vì vậy, đây sẽ là

::new (pv) int(); 

Và cứ thế bởi N3797 8.5.1

Việc khởi xảy ra dưới các hình thức

T x(a); 
T x{a}; 

cũng như trong các biểu thức mới (5.3.4) được gọi trực tiếp khởi tạo.

Ngữ nghĩa của trình khởi tạo như sau. Kiểu đích là loại đối tượng hoặc tham chiếu được khởi tạo và loại nguồn là loại biểu thức khởi tạo. Nếu bộ khởi tạo là không phải là biểu thức đơn lẻ (có thể được đặt dấu ngoặc đơn), loại nguồn là không được xác định.

- Nếu trình khởi tạo là (), đối tượng được khởi tạo giá trị.

Để giá trị khởi tạo một đối tượng kiểu T có nghĩa là:

- nếu không, đối tượng được zero-khởi tạo.

Và cả hai kêu vang mới và GCC đồng ý với tiêu chuẩn: Live

6

Tiêu chuẩn dường như ủng hộ ý kiến ​​của bạn.

Từ 20.8.2.2.6:

xây dựng một đối tượng trong bộ nhớ thông qua vị trí mới thể hiện :: mới (pv) T (std :: phía trước (args) ...)

Vì int mới() là giá trị được khởi tạo, ngược lại với int mới, tôi mong đợi bằng không.

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