tôi muốn kiểm tra địa chỉ của biến tôiTại sao địa chỉ của biến dễ bay hơi này luôn ở mức 1?
volatile int clock;
cout << &clock;
Nhưng nó luôn luôn nói rằng x là tại địa chỉ 1. Am i làm một cái gì đó vậy ??
tôi muốn kiểm tra địa chỉ của biến tôiTại sao địa chỉ của biến dễ bay hơi này luôn ở mức 1?
volatile int clock;
cout << &clock;
Nhưng nó luôn luôn nói rằng x là tại địa chỉ 1. Am i làm một cái gì đó vậy ??
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;
Tôi nghĩ rằng việc chuyển đổi hoạt động tự động? –
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
Oh! Johannes cũng là con người! –
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
Đá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
Đâ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ỏ đếnT
, con trỏ đếnconst T
, và con trỏ đếnvolatile 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 đếnvolatile 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
.
* 1 * không cần phải luôn đại diện cho giá trị số - có thể là hợp lý. – Kris