2019年6月16日日曜日

5: C++における'this'はポインターでも変数でもない

<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>

なぜ、'this'は、いわゆる「rvalue」なのか?'this'はポインターでも変数でもないからです。

話題


About: C++

この記事の目次


開始コンテキスト



ターゲットコンテキスト



  • 読者は、'this'は、ポインターではなく(また、いかなる変数でもなく)、あるアドレスを表わすキーワードであることを理解する。

オリエンテーション


Hypothesizer 7
ほとんどのチュートリアルは(人気があろうがなかろうが)、'this'はポインターであると気軽に述べるが、それでは、なぜ、以下のコードは、「lvalue required as unary ‘&’ operand」といったコンパイルエラーを引き起こすのだろうか?

@C++ ソースコード
#include <iostream>
			
			class Test1 {
				void test1 ();
			};
			
			void Test1::test1 () {
				::std::cout << "The address of 'this' is '" << &this << "'." << ::std::endl << ::std::flush;
			}

はあ?...もしも、'this'がポインターであったなら、「this」という表現は、lexpressionであるはずだ...

1つ明確にしておこう: 'ポインター'は、値がアドレスである変数であり、変数が単独で表現として使われたものは全て、lexpressionである。

したがって、是正すべき誤謬があるに違いない、どこかに。


本体


1: 'this'は、ポインターではなく、あるアドレスを表わすキーワードである


Hypothesizer 7
実のところ、'this'は、ポインターではなく(また、いかなる変数でもなく)、あるアドレスを表わすキーワードである。

はあ?何が違うわけ?...えーと、違いを理解していない人がいるならば、その人は、'変数'とは何かを理解していないに違いない。

例えば、「(Test1 * const) 1」という表現は、ポインターではなく(また、いかなる変数でもなく)、あるアドレスを表わす表現であり、確かに、rexpressionである。

C++標準が言うことを私は盲目的には受け入れないが(なぜなら、それが、つじつまの合わない説明を含んでいるから)、'this'については、それはリーズナブルな説明を与えている: 「thisというキーワードは、当該関数が呼ばれる対象のオブジェクトのアドレスを値とするlvalueでない表現である」。


2: 結びとその先


Hypothesizer 7
これで、'this'は、ポインターではなく、あるアドレスを表わすキーワードであることを理解したようだ。

C++について、まだ他にも不満足な説明があるので、将来の記事にてもっとリーズナブルな説明を試みよう。


参考資料


<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>