<table>
  <thead>
    <tr>
      <th>Expression</th>
      <th>Explanation</th>
      <th>

Can change `p`?
      </th>
      <th>

Can change `*p`?
      </th>
    </tr>
  </thead>
<tbody>
<tr>
  <td>

```cpp
const X * p
X const * p
```
  </td>
  <td>

`p` points to an `X` that is `const`.
  </td>
  <td>

  **+**
  </td>
  <td>
  
  **-**
  </td>
</tr>
<tr>
  <td>

```cpp
X * const p
```

  </td>
  <td>

`p` is a `const` pointer to an `X` that is non-`const`.
  </td>
  <td>

  **-**
  </td>
  <td>
  
  **+**
  </td>
</tr>

<tr>
  <td>

```cpp
const X * const p
X const * const p
```

  </td>
  <td>

`p` is a `const` pointer to an `X` that is `const`.
  </td>
  <td>

  **-**
  </td>
  <td>
  
  **-**
  </td>
</tr>

<tr>
  <td>

```cpp
const X& r
X const& r
```

  </td>
  <td>

`r` is a reference to an `X` that is `const`.

It means `r` aliases an `X` object, but you can’t change that `X` object via `r`.
  </td>
  <td>

  **-**
  </td>
  <td>
  
  *Not appliable*
  </td>
</tr>

<tr>
  <td><s>

```cpp
X& const r
```

  </s></td>
  <td>

**Don't do it:  it is nonsense.**

`r` is a `const` reference to an `X`.

That is redundant — references are always `const`.

`X& const r` is functionally equivalent to `X& r`.
  </td>
  <td>

  **+**
  </td>
  <td>
  
  *Not appliable*
  </td>
</tr>
</tbody>
</table>