Xem xét mã này:
#include <vector>
#include <iostream>
enum class A
{
X, Y
};
struct Test
{
Test(const std::vector<double>&, const std::vector<int>& = {}, A = A::X)
{ std::cout << "vector overload" << std::endl; }
Test(const std::vector<double>&, int, A = A::X)
{ std::cout << "int overload" << std::endl; }
};
int main()
{
std::vector<double> v;
Test t1(v);
Test t2(v, {}, A::X);
}
Bản in này:
vector overload
int overload
Tại sao điều này không tạo ra lỗi biên dịch do độ phân giải quá tải mơ hồ? Nếu hàm tạo thứ hai bị loại bỏ, chúng ta sẽ nhận được vector overload
hai lần. Làm thế nào / bởi số liệu nào là int
một kết hợp tốt hơn rõ ràng hơn {}
so với std::vector<int>
?
Chữ ký của nhà xây dựng chắc chắn có thể được cắt bớt, nhưng tôi chỉ bị lừa bởi một đoạn mã tương đương và muốn đảm bảo không có gì quan trọng bị mất cho câu hỏi này.
{}
có hiệu quả trong một số trường hợp đặc biệt, nhưng nói chung là không chính xác (đối với người mới bắt đầu, std::vector<int> x = {};
công việc, std::vector <int> x = 0;
thì không). Nó không đơn giản như " {}
gán số không".
struct A { int x = 5; }; A a = {};
không gán số 0 theo bất kỳ nghĩa nào, nó xây dựng một A
với a.x = 5
. Điều này là không giống nhau A a = { 0 };
, không khởi tạo a.x
thành 0. Số 0 không phải là vốn có {}
, nó vốn có với cách mỗi loại được xây dựng mặc định hoặc khởi tạo giá trị. Xem ở đây , ở đây và ở đây .
{}
là một khối mã, gán 0 cho các biến - ví dụ: const char x = {}; được đặt thành 0 (null char), tương tự cho int, v.v.