C++ style: Stroustrup' s placement of pointer asterisks
C++ emphasis heavily on types and when it comes to pointers declaration, to avoid any sort of confusion, Bjarne suggested - Stick to one pointer per declaration
.
From Bjarne Stroustrup's C++ Style and Technique FAQ [emphasis added]:
Is
int* p;
right or isint *p;
right?Both are "right" in the sense that both are valid C and C++ and both have exactly the same meaning. As far as the language definitions and the compilers are concerned we could just as well say
int*p;
orint * p;
The choice between
int* p;
andint *p;
is not about right and wrong, but about style and emphasis. C emphasized expressions; declarations were often considered little more than a necessary evil. C++, on the other hand, has a heavy emphasis on types.A
typical C programmer
writesint *p;
and explains it*p is what is the int
emphasizing syntax, and may point to the C (and C++) declaration grammar to argue for the correctness of the style. Indeed, the*
binds to the namep
in the grammar.A
typical C++ programmer
writesint* p;
and explains itp is a pointer to an int
emphasizing type. Indeed the type ofp
isint*
. I clearly prefer that emphasis and see it as important for using the more advanced parts of C++ well.The critical confusion comes (only) when people try to declare several pointers with a single declaration:
int* p, p1; // probable error: p1 is not an int*
Placing the
*
closer to the name does not make this kind of error significantly less likely.
int *p, p1; // probable error?
Declaring one name per declaration minimizes the problem - in particular when we initialize the variables. People are far less likely to write:
int* p = &i;
int p1 = p; // error: int initialized by int*
And if they do, the compiler will complain.
Whenever something can be done in two ways, someone will be confused. Whenever something is a matter of taste, discussions can drag on forever. Stick to one pointer per declaration and always initialize variables and the source of confusion disappears.See The Design and Evolution of C++ for a longer discussion of the C declaration syntax.
I cannot speak for Bjarne, but tying the asterisk (and ampersand in case of reference) to the type makes sense because being a pointer is semantically part of the type of the variable. The name of the variable is p
and its type is int*
. The name is not *p
and the type is not int
.
It is nearly always possible to avoid multiple variable declarations in a single declaration, so that is not an issue.
In my opinion, this approach is clearer, especially in case of return types:
T*
function(Args...);
T
*function(Args...);