2014-09-05 12 views
18

Hôm nay, tôi stumbled khi these standard declarations của std::vector constructors:Constructors: Sự khác biệt giữa mặc định và ủy thác một tham số

// until C++14 
explicit vector(const Allocator& alloc = Allocator()); 
// since C++14 
vector() : vector(Allocator()) {} 
explicit vector(const Allocator& alloc); 

Sự thay đổi này có thể được nhìn thấy ở hầu hết các container tiêu chuẩn. Một ví dụ hơi khác nhau là std::set:

// until C++14 
explicit set(const Compare& comp = Compare(), 
       const Allocator& alloc = Allocator()); 
// since C++14 
set() : set(Compare()) {} 
explicit set(const Compare& comp, 
       const Allocator& alloc = Allocator()); 

Sự khác biệt giữa hai mẫu và lợi ích của chúng (dis) là gì?
Chúng có tương đương hoàn toàn không - trình biên dịch có tạo ra thứ gì đó tương tự như thứ hai từ lần đầu tiên không?

+1

Bạn nói "STL" vùng chứa. Bạn có nghĩa là chữ ký của các hàm thành viên trong thùng thư viện chuẩn như được bắt buộc bởi chính bản thân chuẩn hoặc mã của một số triển khai cụ thể? –

+0

@LightnessRacesinOrbit Tôi có nghĩa là các cựu: Tôi giả sử chữ ký của các chức năng này là tiêu chuẩn (en.cppreference.com nói rằng có một sự thay đổi đến từ tiêu chuẩn - "kể từ C + + 14"). – Nelfeal

+0

@LightnessRacesinOrbit Tôi không thực sự hiểu những gì cần chỉnh sửa; là "STL" sai? Đối với tôi, nó là một phần của thư viện chuẩn sử dụng các mẫu (do đó thư viện mẫu "tiêu chuẩn"). Hay nó là cái gì khác ? – Nelfeal

Trả lời

18

Sự khác biệt là

explicit vector(const Allocator& alloc = Allocator()); 

explicit ngay cả đối với trường hợp đối số mặc định được sử dụng, trong khi

vector() : vector(Allocator()) {} 

thì không. (Các explicit trong trường hợp đầu tiên là cần thiết để ngăn chặn Allocator s từ là mặc nhiên chuyển đổi thành một vector.)

Có nghĩa là bạn có thể viết

std::vector<int> f() { return {}; } 

hoặc

std::vector<int> vec = {}; 

trong lần thứ hai trường hợp nhưng không phải là trường hợp đầu tiên.

Xem LWG issue 2193.

+0

Nếu từ khóa rõ ràng bị loại bỏ, tôi giả định rằng một Allocator có thể được chuyển đổi hoàn toàn thành một véc-tơ? – Nelfeal

+0

@Nelxiost chính xác, mà chúng tôi không muốn. –

+3

Ooh điều này thú vị hơn rất nhiều so với những gì tôi mong đợi khi đọc câu hỏi. –

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