2014-10-27 20 views
14

Tôi chạy vào một vấn đề vìkhông nên std :: pair <T1,T2> có constructor mặc định tầm thường nếu T1 và T2 có?

std::is_trivially_default_constructible<std::pair<T1,T2>>::value == false; 

ngay cả khi

std::is_trivially_default_constructible<T1>::value == true; 
std::is_trivially_default_constructible<T2>::value == true; 

Tôi thất bại trong việc tìm ra một lý do chính đáng cho thiết kế này. Nó sẽ không thích hợp cho std::pair<T1,T2> để có một nhà xây dựng =default nếu T1T2 có?

Có một công việc đơn giản xung quanh (đơn giản hơn việc xác định pair<> của riêng tôi) không?

+0

Ai đó nên [gửi vấn đề thư viện] (https://isocpp.org/std/submit-a-library-issue). – edmz

Trả lời

6

Lý do đơn giản là: lịch sử! Bản gốc std::pair<T0, T1> không thể có một hàm tạo mặc định tầm thường vì nó có một số hàm tạo khác. Nó được định nghĩa để khởi tạo các thành viên của nó. Thay đổi hành vi này trong std::pair<T0, T1> đối với các loại có thể xây dựng trivially nơi mọi người dựa vào giá trị được khởi tạo sẽ là một thay đổi phá vỡ.

Ngoài lý do lịch sử, hàm tạo mặc định là std::pair<...> được định nghĩa là một hàm tạo constexpr. Một hàm xây dựng mặc định constexpr không thể được mặc định.

Tôi không biết một công việc nào ngoài việc tạo lớp tùy chỉnh.

+0

Có sử dụng một bộ sửa lỗi này không? –

+0

@NeilKirk: 'std :: tuple <...>' có một hàm tạo mặc định 'constexpr' không mặc định (thực tế,' std :: pair <...> 'hàm tạo mặc định cũng là' constexpr'; tôi không nghĩ rằng một hàm tạo 'constexpr' có thể được mặc định). Tức là, 'std :: tuple <...>' không cung cấp một hàm tạo mặc định tầm thường. –

+0

@ Neil Kirk: constructor mặc định constexpr tuple() có cùng yêu cầu đối với std :: pair: "... Effects: Giá trị khởi tạo mỗi phần tử" (20.4.2.1 n3242), vì vậy nó không thể làm gì và do đó có thể không tầm thường. – user396672

1

Hàm tạo mặc định của std :: pair value-initializes cả hai phần tử của cặp, đầu tiên và thứ hai, do đó, nó không thể là tầm thường.

+0

Vâng, tôi biết. Đó chính là vấn đề. – Walter

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