なぜ、'this'は、いわゆる「rvalue」なのか?'this'はポインターでも変数でもないからです。
話題
About: C++
この記事の目次
開始コンテキスト
- 読者は、C++とはどういうものであるかの基本的な知識を持っている、たとえ、一部の、難しいと考えられている要素を正確に理解していないとしても。
- 読者は、'データ'、'変数'、'表現'、'値'を著者がどのように弁別して使っているかの知識を持っている。
- 読者は、C++におけるいわゆる「lvalue」および「rvalue」が何であるかの知識を持っている。
ターゲットコンテキスト
- 読者は、'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++について、まだ他にも不満足な説明があるので、将来の記事にてもっとリーズナブルな説明を試みよう。