T const&
const T&
T& const //error
上記の3つの違いは何ですか?もしそうなら&
、*
何が起こるでしょうか?
最初の 2 つの形式は同等ですが、私は最初の形式の方がテンプレート引数の演繹について推論しやすく、何が定数になるか (その前にあるものすべて) が明確になるため、私int const*
は最初の形式を好みconst int*
ます。
また、接頭辞構文を使用して定数ポインタを宣言する方法はありません (たとえば、型の先頭にあるint* const
whereに相当するものはありませんconst
)。したがって、構文の統一性のために、常に後置バージョンを使用したいと思います。
3 番目の形式は、通常のコンテキストで使用した場合のエラーであり、テンプレート パラメーターを推定する場合と同等ですT&
(参照は再割り当てできないため、ある意味で常に定数であり、const
冗長と見なされます)。
に変更&
する*
と、最初の 2 つの形式は同じままですが、3 番目の形式は 型のオブジェクトへの定数ポインターを宣言しますT
。これは、指しているオブジェクトではなく、ポインター自体が一定であることを意味することに注意してください (再割り当てはできません)。
int a = 0;
int b = 1;
int* const pA = &a; // p cannot be reassigned, a can be modified
*pA = 42; // OK
pA = &b; // ERROR
int const* pB = &b; // p can be reassigned, b cannot be modified
*pB = 42; // ERROR
pB = &a; // OK
int const* const pC = &a; // p cannot be reassigned, a cannot be modified
*pC = 42; // ERROR
pC = &b; // ERROR
int& const d = a; // ERROR