2016-05-03 20 views
8

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 pedanticWall cờ)

Trả lời

7

C++ 11 Tiêu chuẩn nói (tôi nhấn mạnh):

5.2.9 Static đúc

4 Nếu không, biểu thức e có thể được chuyển đổi rõ ràng thành loại T bằng cách sử dụng một static_cast của biểu mẫu static_cast<T>(e)nếu tờ khai T t(e); là hình thức tốt, đối với một số biến tạm thời được phát minh t (8.5). Hiệu quả của việc chuyển đổi rõ ràng như vậy cũng giống như thực hiện khai báo và khởi tạo và sau đó sử dụng biến tạm thời như kết quả của việc chuyển đổi. Biểu thức e được sử dụng làm glvalue nếu và chỉ khi khởi tạo sử dụng nó làm glvalue.

5 Nếu không, static_cast sẽ thực hiện một trong các chuyển đổi được liệt kê bên dưới. Không chuyển đổi nào khác được thực hiện rõ ràng bằng cách sử dụng static_cast.

Điều đó giải thích tại sao static_cast trong

B c = static_cast<B>(a); 

kết thúc lên gọi constructor của B.

Nhà điều hành chuyển đổi chỉ được sử dụng nếu T t(e) không được định dạng đúng.

+0

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

+0

@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. –

+0

@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

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