Trong C++ 98, nguyên mẫu cho hàm tạo điền của std::vector
có giá trị mặc định cho bộ khởi tạo.Tại sao C++ 11 loại bỏ giá trị mặc định khỏi các nguyên mẫu của std :: constructor fill của vector?
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
C++ 11 sử dụng hai nguyên mẫu.
explicit vector (size_type n);
vector (size_type n, const value_type& val,
const allocator_type& alloc = allocator_type());
(Trong C++ 14 nhà xây dựng fill thay đổi một lần nữa, nhưng nó không phải là điểm của câu hỏi này.)
Một liên kết tham chiếu là here.
Tại sao C++ 11 không dùng giá trị khởi tạo mặc định value_type()
?
Nhân tiện, tôi đã cố gắng biên dịch mã sau bằng clang++ -std=c++11
và nó đã phát ra lỗi, có nghĩa là loại giá trị vẫn cần phải có hàm tạo mặc định như S() {}
, tức là có thể cấu hình mặc định.
#include <vector>
struct S {
int k;
S(int k) : k(k) {} // intentionally remove the synthesized default constructor
};
int main() {
std::vector<S> s(5); // error: no matching constructor
}
Ví dụ bạn hiển thị ở cuối sẽ không hoạt động trước C++ 11 hoặc vì 'S' không được cấu hình mặc định. Và C++ 11 không * không dùng nữa * giá trị mặc định, hàm tạo duy nhất đó được thay thế bởi hai giá trị khác. – Praetorian
Giá trị mặc định là ác. –
@Praetorian yeah Tôi nên nói C++ 11 * loại bỏ * giá trị mặc định từ nguyên mẫu của nhà xây dựng. – user8385554