2011-11-23 20 views

Trả lời

18

iostream sẽ truyền hầu hết các con trỏ đến void * để hiển thị - nhưng không có chuyển đổi nào tồn tại cho volatile con trỏ. Như vậy C + + rơi trở lại để đúc tiềm ẩn để bool. Đúc để void* rõ ràng nếu bạn muốn in địa chỉ:

std::cout << (void*)&clock; 
+0

Tôi nghĩ rằng việc chuyển đổi hoạt động tự động? –

+0

Có, có một chuyển đổi tự động. Nó chỉ là nó được tự động chuyển thành 'bool', không phải' void * ', vì C++ không có chuyển đổi tự động thành' void * 'cho con trỏ (C, nhưng C++ yêu cầu một diễn viên rõ ràng) – bdonlan

+7

Oh! Johannes cũng là con người! –

17

Có một operator<< cho const void*, nhưng không có operator<< cho volatile void*, và chuyển đổi ngầm sẽ không loại bỏ volatile (nó sẽ không loại bỏ const hoặc là).

Như GMan cho biết, chứng chỉ cv của loại được chỉ định không liên quan đến doanh nghiệp in địa chỉ. Có lẽ sự quá tải được xác định trong 27.7.3.6.2 nên là operator<<(const volatile void* val);, tôi không thể thấy ngay bất kỳ bất lợi nào. Nhưng không phải vậy.

#include <iostream> 

void foo(const void *a) { 
    std::cout << "pointer\n"; 
} 

void foo(bool a) { 
    std::cout << "bool\n"; 
} 

int main() { 
    volatile int x; 
    foo(&x); 
    std::cout << &x << "\n"; 
    int y; 
    foo(&y); 
    std::cout << &y << "\n"; 
    void foo(volatile void*); 
    foo(&x); 
} 

void foo(volatile void *a) { 
    std::cout << "now it's a pointer\n"; 
} 

Output:

bool 
1 
pointer 
0x22cd28 
now it's a pointer 
+0

Đánh bại tôi theo nghĩa đen một giây, khẩn cấp :(.Để thêm vào: trong giải pháp được đề xuất bởi bdonlan, diễn viên kiểu c sẽ là 'const_cast'. Đối với mục đích in ấn, nó không thực sự là một mối quan tâm. – GManNickG

0

Đây là vì không có tình trạng quá tải cho operator << mà phải mất một con trỏ đến volatile, và không có chuyển đổi con trỏ có thể đáp ứng điều đó.

Theo C++ chuẩn,

cho bất kỳ loại T, con trỏ đến T, con trỏ đến const T, và con trỏ đến volatile T được coi là loại thông số khác nhau, cũng như các tài liệu tham khảo để T, tài liệu tham khảo để const T, và tài liệu tham khảo đến volatile T.

Operator << has no overload for pointers to non-static member, con trỏ để dễ bay hơi hoặc hàm con trỏ, do đó, cố gắng xuất các đối tượng đó gọi chuyển đổi ẩn thành bool.

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