Я хотел проверить адрес моей переменной
volatile int clock;
cout << &clock;
Но он всегда говорит, что x находится по адресу 1. Я что-то делаю неправильно?
Я хотел проверить адрес моей переменной
volatile int clock;
cout << &clock;
Но он всегда говорит, что x находится по адресу 1. Я что-то делаю неправильно?
iostreams будет отображать большинство указателей на void *
для отображения, но для указателей volatile
не существует никакого преобразования. Так как С++ возвращается к неявному приведению в bool
. Если вы хотите напечатать адрес, введите void*
явно:
std::cout << (void*)&clock;
Здесь operator<<
для const void*
, но там нет operator<<
для volatile void*
, и неявное преобразование не удалит volatile
(он не удалит const
).
Как говорит GMan, cv-квалификация указанного типа не должна относиться к делу печати адреса. Возможно, перегрузка, определенная в 27.7.3.6.2, должна быть operator<<(const volatile void* val);
, я не могу сразу увидеть какой-либо недостаток. Но это не так.
#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 a pointer\n";
}
Вывод:
bool
1
pointer
0x22cd28
now it a pointer
Это связано с тем, что нет перегрузки для operator <<
, которая принимает указатель на volatile
, и нет никакого преобразования указателя, которое могло бы удовлетворить его.
Согласно стандарту С++,
для любого типа
T
, указатель наT
, указатель наconst T
, а указатель наvolatile T
считаются отдельными типами параметров, как ссылка наT
, ссылка наconst T
и ссылка доvolatile T
.
Оператор <<
не имеет перегрузки для указателей на нестатический элемент, указывает на изменчивые или указатели на функции, поэтому попытка вывода таких объекты вызывают неявное преобразование в bool
.