Sau khi đọc this tôi đã cố gắng làm cho chuyển đổi như vậy với static_cast
:constructor chuyển đổi static_cast vs nhà điều hành chuyển đổi
class A;
class B {
public:
B(){}
B(const A&) //conversion constructor
{
cout << "called B's conversion constructor" << endl;
}
};
class A {
public:
operator B() const //conversion operator
{
cout << "called A's conversion operator" << endl;
return B();
}
};
int main()
{
A a;
//Original code, This is ambiguous,
//because both operator and constructor have same cv qualification (use -pedantic flag)
B b = a;
//Why isn't this ambiguous, Why is conversion constructor called,
//if both constructor and operator have same c-v qualification
B c = static_cast<B>(a);
return 0;
}
tôi mong đợi nó để không biên dịch, vì cả hai constructor và khai thác có cùng c-v trình độ. Tuy nhiên nó biên dịch, thành công và static_cast
gọi hàm tạo thay vì toán tử. Tại sao?
(biên soạn sử dụng gcc 4.8.1 với pedantic
và Wall
cờ)
Tôi hiểu rằng câu này có nghĩa rằng nếu 'B tạm thời (a)' là hợp lệ 'static_cast' có thể được định dạng trước, nhưng tôi không thấy có lý do tại sao hàm tạo được ưu tiên. – PcAF
@PcAF, tôi không thể tìm thấy mệnh đề cho biết 'static_cast' có thể được thực hiện bằng toán tử chuyển đổi. Tuy nhiên, nếu có, nó được ưu tiên thấp hơn so với ở trên. –
@R Sahu Xóa hàm tạo chuyển đổi 'B (const A &)' và bây giờ 'static_cast' làm việc với toán tử chuyển đổi. – PcAF