2017-07-27 62 views
5

Giả sử tôi có mã này:là in ấn của một con trỏ thành viên đến một int định nghĩa

#include <iostream> 

struct Mine 
{ 
    int a; 
    int b; 
}; 


int main() 
{ 

    int Mine::* memberPointerA = &Mine::a; 
    int Mine::* memberPointerB = &Mine::b; 



    std::cout << memberPointerA; 
    std::cout << "\n"; 
    std::cout << memberPointerB; 
} 

Khi tôi chạy này với Microsoft Visual C++ (2015)

tôi nhận được kết quả như sau

1 
1 

Sản lượng tôi mong đợi là một cái gì đó giống như thế này:

1 
2 

Vì vậy, điều này đặt ra câu hỏi: Đây có phải là in của một con trỏ thành viên được xác định hành vi?

Trả lời

12

Có một chuyển đổi được xác định từ con trỏ đến bool. Vì các con trỏ biến thành viên không phải là NULL, chúng đánh giá là đúng và in là 1.

+0

Oh .... điều đó có ý nghĩa (Tôi vừa nhận ra điều này có thể xảy ra khi bạn trả lời) – DarthRubik

7

Vấn đề chính ở bàn tay là không thể chuyển đổi con trỏ thành thành thành void*, đó là những gì quá tải thường xử lý con trỏ in.

Do đó, chuyển đổi tốt nhất tiếp theo được sử dụng, là con trỏ chuyển đổi->bool. Cả hai con trỏ không phải là con trỏ null, do đó bạn có được kết quả đầu ra mà bạn thấy.

Nếu bạn thử in các con trỏ "bình thường" (trái ngược với con trỏ đến thành viên), bạn sẽ nhận được một số đầu ra dọc theo dòng của những gì bạn mong đợi ban đầu.

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