<>: Template declaration and usage. And bitwise shift operators if used as << and >>, also overloaded as reads and writes into streams.This is for shifting on either left or right side. Before few years, back these two use cases were being regularly confused by various compilers, and programmers had to receive extra spaces in complex templates.
[] : Array indexing. And lambda definition / capture list. Oh, and also Objective-C uses square brackets to send messages.
{} : Code blocks. Only code blocks, right? Wrong. Also initialization. And the modern idealize makes a heavy push towards {}-based initialization.
(): Construction of variables, definition/declarations of functions, function calls. The first two cases can be disoriented in a remarkable fashion, and the “issue” still exists. prepare for macros too. Ah, and casts (h/t Nathan F Yospe).
/* */ : Comments. Unambiguous, right? Wrong. At times “/*” can be a legal language construct extend the comment: int* pa = &a; int* pb = &b; int c = *pa / *pb, and we suddenly have a place where C++ requires a whitespace among among operators.
#if / #endif