I am reading the C++ Primer Book (fifth edition) and I have a question upon the book i am reading. It says:
The type
void*is a special pointer type that can hold the address of any object. Like any other pointer, avoid*pointer holds an address, but the type of the object at that address is unknown.
Ok, so I understand that but… I have many contradictions to the statement. First of all, can't you use auto? Doesn't it do the same thing as void? Meaning aren't
void *somePtr;
and
auto *somePtr;
the same?
Second of all it says the type of the attached address is unknown. Can't you use typeid to get the type? Like this:
int a = 5;
auto *somePtr = 5;
std::cout << typeid(*somePtr).name() << std::endl;
Did you try running your examples through a compiler? As it happens, neither
auto * p; // error
nor
int a = 0;
void * p = &a;
std::cout << typeid(*p) << '\n'; // error
will compile while both
void * p;
and
int a = 0;
auto * p = &a;
std::cout << typeid(*p) << '\n';
are fine.
To give an informal and easy to remember analogy for void * and auto *, think of void * p as telling the compiler
Don't care about what
ppointer points to, I'll handle it myself (at run-time).
whereas auto * p = (expression) tells the compiler
Please figure out for me (at compile-time) what (pointer) type
(expression)evaluates to and make the type ofpbe accordingly.
As a matter of fact, auto * is rarely useful. You can simply write auto instead and if the initializing expression is a pointer type, the auto will be deduced to be a pointer, too.
auto uses compile-time type inference: the variable has a definite type which is its correct type, however the type is inferred from its value. Throughout the lifetime of the auto variable, the compiler will ensure that it is being used in accordance with its actual inferred type
void* can indeed hold the address of any object, but as opposed to auto, you must explicitly convert the void* pointer to a different type before using it. Unlike auto that conversion is explicit, and unlike auto the compiler cannot warn about improper usage.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With