$ 9.3.1 / 3:クラスメンバーアクセス構文(5.2.5)の一部ではなく、メンバー(5.3.1)へのポインターを形成するために使用されないid-expression(5.1)がクラスのメンバーで使用される場合これを使用できるコンテキストでのX(5.1.1)、名前ルックアップ(3.4)がid式の名前をクラスCの非静的非型メンバーに解決する場合、およびid式のいずれかである場合が評価される可能性があるか、CがXまたはXの基本クラスである場合、id式は(* this)(9.3.2)を後置式として使用してクラスメンバーアクセス式(5.2.5)に変換されます。 。オペレーター。
これが意味するのは、
myList.push_back(i);
として扱われます
(*this).myList.push_back(i);
$ 9.3.1 / 4:非静的メンバー関数は、const、volatile、またはconstvolatileとして宣言できます。これらのcv修飾子は、thisポインターのタイプに影響します(9.3.2)。
$ 9.3.2 / 1:非静的(9.3)メンバー関数の本体で、キーワードthisは、関数が呼び出されるオブジェクトのアドレスを値とするprvalue式です。クラスXのメンバー関数でのこのタイプはX*です。メンバー関数がconstと宣言されている場合、このタイプはconst X *であり、メンバー関数がvolatileと宣言されている場合、このタイプはvolatile X *であり、メンバー関数がconst volatileと宣言されている場合、このタイプはconstです。揮発性X*。
要約すると、これが意味するのは、メンバー関数の「this」のタイプである「const」は「MyClassconst*」です。事実上、これはMyclass::MyFunc
、「this」ポインタが指すオブジェクトの状態を変更できないことを意味します。
myListのタイプがstd::listであるとすると、メソッドstd :: list :: push_backは、リストに「i」の値を挿入するときにインスタンス変数「myList」を変更します。
MyClass::MyFunc
しかし、これは、オブジェクトの状態を変更しないことを約束する「const」メンバー関数のセマンティクスを破ります。
したがって、実際には、このメンバー関数から「const」を削除するか、const_castを使用してこの特定の操作のconstnessを削除する必要があります。