IBM appears to have conflicting information about when a variable is allocated storage (instantiated).
According to following, it literally says on the top of the page that a variable won't get storage allocated when it's declared! This in itself is not the whole picture, and readers can get mis-led.
IBM Linux Compilers
A declaration establishes the names and characteristics of data objects used in a program. A definition allocates storage for data objects, and associates an identifier with that object. When you declare or define a type, no storage is allocated.
It then later went on to clarify, towards the end of the page, the following, which states if towards the end of the file the variable is only declared and not initialized, it then becomes defined. And for C++, declaration is definition. Man they should add a disclaimer for the above statement to read this also.
C only
C++ onlyA tentative definition is any external data declaration that has no storage class specifier and no initializer. A tentative definition becomes a full definition if the end of the translation unit is reached and no definition has appeared with an initializer for the identifier. In this situation, the compiler reserves uninitialized space for the object defined.
C++ does not support the concept of a tentative definition: an external data declaration without a storage class specifier is always a definition.
This may be argued to be not as detailed as the IBM one above but it's less confusing.
2.1 — Basic addressing and variable declaration « Learn C++
To recap briefly, computers have random access memory (RAM) that is available for program to use. When a variable is declared, a piece of that memory is set aside for that variable.